U
    f»{j÷ª  ã                   @   st  d dl mZ d dlZd dlmZ d dlZd dlmZ d dl	Z	d dl
Z
d dlZd dlmZ d dlmZmZmZmZmZ d dl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)m*Z*m+Z+m,Z,m-Z-m.Z. d d	l/m0Z0 d d
l1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7m8Z8m9Z9 ej:dd�Z:e ;e:d¡Z<e ;e<ddd¡Z=e ;e:ddd¡Z>e ;e:dddd¡Z?e ;e:dddd¡Z@e ;e<ddd¡ZAe ;e:ddd¡ZBe ;e:dddd¡ZCe ;e<ddd¡ZDe ;e EeF¡d  ddd d!¡ZGe ;eGd"¡ZHe ;eGd#¡ZIdZd$d%„ZJd[d(d)„ZKd*d+„ ZLd,d-„ ZMd.d/„ ZNejOejP Qd0e?eAf¡d1d2„ ƒƒZRejOd3d4„ ƒZSejOd5d6„ ƒZTd\d7d8„ZUejOd9d:„ ƒZVejOd;d<„ ƒZWejOd=d>„ ƒZXejOd?d@„ ƒZYejOdAdB„ ƒZZejOdCdD„ ƒZ[e6ejOdEdF„ ƒƒZ\ejPj]ejOe6dGdH„ ƒƒƒZ^ejPj]ejOdIdJ„ ƒƒZ_ejOdKdL„ ƒZ`ejOdMdN„ ƒZaejOdOdP„ ƒZbejOdQdR„ ƒZcejOdSdT„ ƒZdejOejP QdUe?dVfeAdWfg¡dXdY„ ƒƒZedS )]é    )ÚnullcontextN)Úproduct)Úsparse)Úassert_array_equalÚassert_array_almost_equalÚassert_equalÚassert_allcloseÚassert_array_less)Útesting)Ú
read_labelÚstc_to_labelÚread_source_estimateÚread_source_spacesÚgrow_labelsÚread_labels_from_annotÚwrite_labels_to_annotÚsplit_labelÚspatial_tris_adjacencyÚread_surfaceÚrandom_parcellationÚmorph_labelsÚlabels_to_stc)ÚLabelÚ_blend_colorsÚlabel_sign_flipÚ_load_vert_posÚselect_sourcesÚ	_n_colorsÚ_read_annotÚ_read_annot_cands)ÚSourceSpaces)Ú
mesh_edges)Ú_mesh_borders)Úrequires_sklearnÚget_subjects_dirÚcheck_versionÚ_record_warningsF)ÚdownloadÚsubjectsÚsampleZbemzsample-oct-6-src.fifZMEGzsample_audvis_trunc-meg-lh.stcÚlabelszAud-lh.labelzAud-rh.labelÚlabelzlh.V1.labelz)sample_audvis_trunc-meg-eeg-oct-6-fwd.fifÚ	fsaveragezfsaverage-ico-5-src.fifÚaparcz..ÚioZtestsÚdataztest-lh.labelztest-rh.labelc                  C   sD  |dkr| j n|}t|tƒr"|}n| j }t|tƒr‚t|ƒ}t ||d¡}tt |d¡ƒ\}}tt |d¡ƒ\}}	||g}
||	g}n^t|tƒs”tdƒ‚t	|ƒdkr¨t
dƒ‚d|d	 d
  d|d d
  g}
|d	 d |d d g}g }d	}ttddg| j||
ƒƒD �]<\}\}}}}| j||t	|ƒ … }t|ƒ}d|j|jdk< |jd	 }|t ||¡ }|tj|dd� g}|t	|ƒ7 }dd„ |D ƒ}t	|ƒd	k�rœd}n–g }tt	|ƒƒ}t||ƒD ]r\}}|}t|ƒD ]6}|dd…|f }|t t	|ƒ¡ }t |¡d	 }�qÊt||| d|d||d�}| |¡ �q¶|d	 }| |¡ �q |S )a  Compute a label from the non-zero sources in an stc object.

    Parameters
    ----------
    stc : SourceEstimate
        The source estimates.
    src : SourceSpaces | str | None
        The source space over which the source estimates are defined.
        If it's a string it should the subject name (e.g. fsaverage).
        Can be None if stc.subject is not None.
    smooth : int
        Number of smoothing iterations.
    subjects_dir : str | None
        Path to SUBJECTS_DIR if it is not set in the environment.

    Returns
    -------
    labels : list of Labels | list of list of Labels
        The generated labels. If connected is False, it returns
        a list of Labels (one per hemisphere). If no Label is available
        in a hemisphere, None is returned. If connected is True,
        it returns for each hemisphere a list of connected labels
        ordered in decreasing order depending of the maximum value in the stc.
        If no Label is available in an hemisphere, an empty list is returned.
    NÚsurfúlh.whiteúrh.whitez.src must be a string or a set of source spacesé   z-source space should contain the 2 hemispheresg     @�@r   Úrré   ÚtrisÚlhÚrh©Zaxisc                 S   s   g | ]}t |ƒd kr|‘qS )r   )Úlen)Ú.0Úc© r=   úS/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/tests/test_label.pyÚ
<listcomp>   s      z!_stc_to_label.<locals>.<listcomp>zLabel from stc)ÚsubjectÚcolor)r@   Ú
isinstanceÚstrr$   ÚopÚjoinr   r    Ú	TypeErrorr:   Ú
ValueErrorÚ	enumerateÚzipÚverticesr/   r!   Úshaper   ÚeyeÚnpÚanyr   ÚrangeZonesÚwherer   Úappend) ÚstcÚsrcÚsmoothÚsubjects_dirr@   Zsurf_path_fromZrr_lhZtris_lhZrr_rhZtris_rhr4   r6   r*   ZcntZhemi_idxÚhemiZthis_vertnoZ	this_trisZthis_rrZ	this_dataÚeZ
n_verticesZclustersZthis_labelsÚcolorsr<   rA   Zidx_useÚkZe_useZdata1r+   r=   r=   r>   Ú_stc_to_labelA   sb    



 ÿ
 þrZ   é   Tc                 C   sŠ   |rt | j|jƒ |r$t | j|jƒ dD ]2}t| |ƒ}t||ƒ}d|||f }t |||ƒ q(dD ]$}t| |ƒ}	t||ƒ}
t|	|
|ƒ q`dS )zAssert two labels are equal.©rV   r@   zlabel.%s: %r != %r)rJ   ÚposÚvaluesN)r   ÚcommentrA   Úgetattrr   )Úl0Úl1Údecimalr_   rA   ÚattrZattr0Zattr1ÚmsgZa0Za1r=   r=   r>   Úassert_labels_equalš   s    



rf   c                  C   s4   t tƒ} |  ¡ }| jd7  _t| j|jd ƒ dS )zTest label copying.r5   N)r   Úlabel_fnameÚcopyr]   r   )r+   Zlabel_2r=   r=   r>   Ú	test_copy¬   s    ri   c                  C   sT   t tƒ} | jdkst‚dt| ƒks&t‚t tdd�} | jdks@t‚dt| ƒksPt‚dS )z#Test label subject name extraction.NÚunknownr,   ©r@   )r   rg   r@   ÚAssertionErrorÚrepr)r+   r=   r=   r>   Útest_label_subject´   s    rn   c                  C   sh  t j d¡ dd¡} t  d¡d }ttdƒƒ}ttddƒƒ}ttddƒƒ}t|| | || ddd	�}t|| | || dƒ}t|| | || dd
d	�}tt	|ƒt	|ƒƒ | 
¡ }d|_| 
¡ }	d|	_t t|j|	¡ t t|jd¡ t t|j|	¡ t t|jd¡ || }
tt	|
ƒt	|ƒt	|ƒ ƒ t|
jdt	|ƒ… |jƒ t|
j|jƒ t|
| |ddd� t|
| |ddd� || }t  |jdk¡d d }t  |jdk¡d d }t  |jdk¡d d }t|j| |j| |j|  ƒ t|jd |jd ƒ tt  |j¡t  || ¡ƒ t|jt|j|jƒƒ d|_|| }t|jdƒ tt	|ƒt	|ƒt	|ƒ ƒ t|j|jƒ dt|ƒk�s€t‚t|| |ƒ t|| |ƒ || }t|j|
ƒ t|jt|j|jƒƒ t|| jj|jjƒ t|| jj|jjƒ t t|jd¡ || }t|j|jddd� t|j|jƒ t|| || ƒ t|| | |ƒ || }t|jg ƒ dS )zTest label addition.r   é
   é   g      $@é   r[   r7   Úred)rA   )r   r5   r   g      à?r)   ÚfooNF)r_   rA   é   r8   ÚbothZBiHemiLabel)rM   ÚrandomÚRandomStateZrandÚarangeÚlistrO   r   r   r:   rh   r@   ÚpytestÚraisesrG   Ú__add__rF   Ú__sub__r   r^   rA   rf   rP   rJ   Úuniquer   rV   rm   rl   r7   r8   )r]   r^   Zidx0Zidx1Zidx2ra   rb   Úl2Zl_goodZl_badÚl01Úl02Zi0Úi2ÚiZbhlZbhl2Zbhl_r=   r=   r>   Útest_label_addition¾   sh     r„   Úfnamec              	   C   sp  t tƒ}t| ƒ}| |¡}|j}|j}tddƒrh| tkrh|D ]}d|d< q<tƒ � | 	|¡}W 5 Q R X n
| 	|¡}|d d dk	s†t
‚t |d d |j¡}t |¡d }t t |¡¡d }	t|j|ƒ tt |	|j¡dƒ t |d d | |d¡}
t|j||
 ƒ t dg|¡}tjtd	d
�� t|dd� 	|¡ W 5 Q R X tg dd�}| 	|¡ t|jt g t¡ƒ dS )z Test label in fill and restrict.Úscipyú1.3NZnearestr   FTéÿÿÿÿz!does not contain all of the label©Úmatchr7   )rV   )r   Ú	src_fnamer   ÚrestrictrJ   r^   r%   Úreal_label_fnamer&   Úfillrl   rM   Úin1dZnonzeroZlogical_notr   ZdigitizerQ   rz   r{   rG   r   ÚarrayÚint)r…   rS   r+   Ú	label_srcZvert_in_srcZvalues_in_srcÚsZvertices_statusZvertices_inZvertices_outZ	value_idxrJ   r=   r=   r>   Útest_label_fill_restrict  s2    



r”   c                  C   sV   t tƒ} ttƒ}|  |¡}t|jƒ|jjd ks4t	‚t|j
d ƒ|jjd ksRt	‚dS )zTest IO for label + stc files.r5   r   N)r   Ú	stc_fnamer   r�   Úin_labelr:   Útimesr/   rK   rl   rJ   )rR   r+   Ú	stc_labelr=   r=   r>   Ú'test_label_io_and_time_course_estimates.  s
    
r™   c              	   C   sÄ   t | ƒ}ttƒ}t|jdƒ |jdks*t‚|jdks8t‚| t	 
|d¡¡ tt	 
|d¡ƒ}t||ƒ t	 
|d¡}t|dƒ�}t ||tj¡ W 5 Q R X t|dƒ�}t |¡}W 5 Q R X t||ƒ dS )zTest IO of label files.ztest-lhNrs   zfoo-lh.labelzfoo.pickledÚwbÚrb)rC   r   rg   r   Únamer@   rl   rA   ÚsaverD   rE   rf   ÚopenÚpickleÚdumpÚHIGHEST_PROTOCOLÚload)Útmp_pathÚtempdirr+   Úlabel2ÚdestZfidr=   r=   r>   Útest_label_io9  s    
r§   c                 C   sX   t | |ƒD ]H\}}t|j|jƒ |j|jks0t‚|j|jks@t‚|s
t|j|jƒ q
dS )z$Ensure two sets of labels are equal.N)rI   r   rJ   rœ   rl   rV   r]   )Zlabels_aZlabels_bÚ
ignore_posZlabel_aZlabel_br=   r=   r>   Ú_assert_labels_equalR  s    r©   c              	   C   s<  t | ƒ}d}tj tdd¡}tj tdd¡}tj ||d¡}tj ||d¡}t |¡ t |¡ t tj |d¡|¡ t tj |d¡|¡ t tj |d¡|¡ t tj |d¡|¡ t	j
tdd	�� t|d
|d� W 5 Q R X t|d|d�}dd„ |D ƒ}t||d|d� t|d|d�}	dd„ |	D ƒ}	tt|	ƒt|ƒƒ t|	|ƒD ]\}
}t|
|ƒ �qDdd„ |D ƒ}t||dd|d� tj ||dd¡}tj |d ¡�s¢t‚tj |d ¡�r¸t‚t|d|d |d�}	dd„ |D ƒ}t|	|ƒD ]\}
}t|
|ƒ �qätt |d¡ƒd }t|tddd�ƒj}t|jt t|ƒ¡ƒ dS )z#Test I/O from and to *.annot files.r,   r+   r0   zlh.PALS_B12_Lobes.annotzrh.PALS_B12_Lobes.annotr1   r2   z
PALS_B12_Lobes$r‰   ZPALS_B12_Lobesey©rU   ZPALS_B12_Lobesc                 S   s   g | ]}|j d kr|‘qS )zLOBE.TEMPORAL-lh©rœ   ©r;   r+   r=   r=   r>   r?   u  s     
 z!test_annot_io.<locals>.<listcomp>Zmyparcc                 S   s   g | ]}|j  d ¡s|‘qS )rj   ©rœ   Ú
startswithr¬   r=   r=   r>   r?   x  s      c                 S   s   g | ]}|j  d ¡r|‘qS )ZLOBEr­   r¬   r=   r=   r>   r?   ~  s      Zmyparc2r7   ©rV   rU   z%sh.myparc2.annotÚlÚr©Úannot_fnamerU   c                 S   s   g | ]}|j  d ¡r|‘qS ©r7   ©rœ   Úendswithr¬   r=   r=   r>   r?   ‡  s      r   r\   N)rC   ÚosÚpathrE   rU   ÚmakedirsÚmkdirÚshutilrh   rz   r{   ÚIOErrorr   r   r   r:   rI   rf   Úisfilerl   r   rD   Úsumr   r7   r   rJ   rM   rx   )r£   r¤   r@   r’   Zsurf_srcÚ	label_dirÚsurf_dirr*   ÚparcZparc1ÚltÚrtr³   Zparc_lhr4   r+   r=   r=   r>   Útest_annot_io\  sV    

ÿÿ
ÿþrÄ   c            	   	   C   sl  t ddtd�dd… } t ddtd�dd… }t| dtd�}t| ||ƒD ]’\}}}|j|j  krj|jkspn t‚|j|j  krŠ|jks�n t‚t |j	|j	¡ 
¡ d }t |j	|j	¡ 
¡ d }|dksÌt‚|d	ksFt‚qFtjtd
d�� t| dtdd� W 5 Q R X tjtdd�� tdtdddƒ W 5 Q R X | D ]}d|_�q2tjtdd�� t| dtd� W 5 Q R X dS )zTest morph_labels.r,   r-   rª   Nr[   r)   éd   é\   éX   zwrong and fsaverager‰   Zwrong)rU   Zsubject_fromzNumber of surface verticesÚwhiter7   r5   zsubject_from must be provided)r   rU   r   rI   rV   rl   rœ   rM   r�   rJ   Úmeanrz   r{   rG   ÚRuntimeErrorr   r@   )	Zparc_fsaverageZparc_sampleZparc_fssampÚlfZlsZlfsZperc_1Zperc_2r+   r=   r=   r>   Útest_morph_labels‘  sH      ÿÿ  ÿÿ  ÿ  ÿ
rÌ   c               	   C   s  t ddtd�} tj d¡ t| ƒ¡}tjt	dd��" t
| |dd…tjtjf ƒ W 5 Q R X tjt	dd�� t
| |tj ƒ W 5 Q R X tjt	d	d�� t
| |d
d� W 5 Q R X t
| |ƒ}|jdksÄt‚t|| ƒD ]$\}}| |¡}|j|k ¡ sÎt‚qÎttdƒ}dS )zTest labels_to_stc.r)   r-   rª   r   z
1 or 2 dimr‰   Nzvalues\.shapezmultiple values of subjectrs   rk   )r   rU   rM   rv   rw   Zrandnr:   rz   r{   rG   r   Znewaxisr@   rl   rI   r–   r/   Úallr   r•   )r*   r^   rR   Úvaluer+   r˜   r=   r=   r>   Útest_labels_to_stc¯  s$      ÿ&

rÏ   c              	   C   sè  t jttddtd� t jttddtd� t jtdd�� tdƒ W 5 Q R X t jtd	d�� tt| ƒƒ W 5 Q R X tdd
td�}|D ]0}|j	 
d¡s–t‚|jd
ks¤t‚|jdk	s‚t‚q‚t tddd¡}td|td�}|D ]0}|j	 
d¡sêt‚|jdksøt‚|jdk	sÖt‚qÖtƒ }| |¡ | |¡ dd„ |D ƒ}dd„ tt||ƒƒD ƒ}tdtd�}t||ƒ t|ƒdk�spt‚tdddtd�d }|j	dk�s”t‚tdddtd�d }|j	dk�s¸t‚t jtdd�� tdd|dtd � W 5 Q R X dS )!z1Test reading labels from FreeSurfer parcellation.r)   Zblar¯   z	bla.annotr²   zdoes not existr‰   rs   zno candidater7   z-lhNr+   zrh.aparc.annotz-rhr8   c                 S   s   g | ]
}|j ‘qS r=   r«   r¬   r=   r=   r>   r?   æ  s     z/test_read_labels_from_annot.<locals>.<listcomp>c                 S   s   g | ]\}}|‘qS r=   r=   )r;   rœ   r+   r=   r=   r>   r?   ç  s     rª   éD   úaparc.a2009sZAngu)rÁ   ÚregexprU   r   zG_pariet_inf-Angular-lhz.*-.{4,}_.{3,3}-L©rÒ   rU   zG_oc-temp_med-Lingual-lhzdid not match any ofr-   )rÁ   r³   rÒ   rU   )rz   r{   rG   r   rU   r¼   r   r   rC   rœ   r¶   rl   rV   rA   rD   rE   ry   ÚextendÚsortedrI   r©   r:   rÊ   )r£   Ú	labels_lhr+   r³   Ú	labels_rhZlabels_lhrhÚnamesZlabels_bothr=   r=   r>   Útest_read_labels_from_annotÃ  sp    ÿ
 ÿÿÿ


 ÿÿþþ   þrÙ   c                  C   sB   t   td ¡} |  ¡  dd„ | D ƒ}tdtd�}t||dd� dS )	zBTest reading labels from parc. by comparing with mne_annot2labels.z/*.labelc                 S   s   g | ]}t |ƒ‘qS r=   )r   )r;   r…   r=   r=   r>   r?     s     z<test_read_labels_from_annot_annot2labels.<locals>.<listcomp>r)   rª   T)r¨   N)Úglobr¿   Úsortr   rU   r©   )Zlabel_fnamesZ
labels_mner*   r=   r=   r>   Ú(test_read_labels_from_annot_annot2labels  s
    rÜ   c              
      s^  t | ƒ‰ tdtd�}t tdd¡}t ˆ dd¡}t |¡ t t |d¡|¡ t t |d¡|¡ t t ˆ dd¡¡ t ˆ ddd¡}t	|ddˆ d� t 
|d	 ¡s¨t‚t 
|d
 ¡sºt‚|D ]}|jdkr¾ qÒq¾t	|gddˆ d� t 
|d ¡söt‚t 
|d ¡�s
t‚|D ]}|jdk�r �q(�qt	|gddˆ d� t 
|d ¡�sNt‚t 
|d ¡�sbt‚tjtt	|d ddˆ d� ‡ fdd„dD ƒ}|D ],}tjtdd�� t	||d� W 5 Q R X �q’tdt|d d�}tdt|d d�}	| |	¡ dd„ |D ƒ}
|D ] }|
 |j¡}t||| ƒ �q |D ]}t	|d|dtd� �q&tdt|d d�}tdt|d d�}| |¡ d d„ |D ƒ}|D ] }| |j¡}t||| ƒ �q€tjtt	|d|d td!� t	|d|d dtd� |d"d"… }|d  ¡ |d< d"|d _t	|d|d dtd� |d# j|d _tjtt	|d|d dtd� d$|d _tjtt	|d|d dtd� |d"d"… }|d% }|d& }| || ¡ tjtt	|d|d dtd� d'd„ |D ƒ}t	|dd"… d|d dtd� td|d td!�}tt|ƒt|ƒƒ |d }|d( }t|jd)ƒ t t |j|j¡¡�s.t‚|d"d"… }d"|d _tjtt	||d d� d"S )*z1Test writing FreeSurfer parcellation from labels.r)   rª   r0   r1   r2   r+   z%s.%s.annotÚtest1)r7   rÝ   )r8   rÝ   r7   Útest2)r7   rÞ   )r8   rÞ   r8   Útest3)r7   rß   )r8   rß   r   Ztest4c                    s   g | ]}t  ˆ |d  ¡‘qS )z-myparc)rD   rE   )r;   rV   ©r¤   r=   r>   r?   4  s     z.test_write_labels_to_annot.<locals>.<listcomp>©r7   r8   rU   r‰   )r³   )rU   r³   r5   c                 S   s   g | ]
}|j ‘qS r=   r«   r¬   r=   r=   r>   r?   @  s     T)r³   Ú	overwriterU   c                 S   s   g | ]
}|j ‘qS r=   r«   r¬   r=   r=   r>   r?   O  s     r²   Nr3   )gš™™™™™ñ?ç      ð?rã   rã   rt   é2   c                 S   s   g | ]}|j  d ¡r|‘qS r´   rµ   r¬   r=   r=   r>   r?   y  s      rˆ   z
unknown-lh)rC   r   rU   rD   rE   r·   r¹   r»   rh   r   Úexistsrl   rV   rz   r{   rF   ÚwarnsÚRuntimeWarningrÔ   Úindexrœ   rf   rG   rA   rQ   r   r:   rM   rÍ   r�   rJ   )r£   r*   rÀ   Ztemp_surf_dirÚdstr+   Úfnamesr…   Úlabels2Zlabels22rØ   ÚidxZlabels3Zlabels33Znames3Zlabels_Z	cuneus_lhZprecuneus_lhrÖ   Zlabels_reloadedZlabel0Úlabel1Zlabels4r=   rà   r>   Útest_write_labels_to_annot  sâ    


 ÿÿÿ
 ÿ
ÿÿ
 ÿ ÿ
 ÿ þ
 þ þ ÿ
ÿ

ÿrî   c               +   C   s†  t ddddtd�} | d }t t|jd¡ d}t||td	�\}}t|j|d ƒ t|j|d
 ƒ || }|j|_|j	|_	|j
|_
t||ƒ |j|td	�\}}t||ƒ t||ƒ t|dd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'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9g+}	t|j|	ƒ t|jd:ƒ tt tdd;d<¡ƒ}
|
jd=dtd>�}td?d@„ |D ƒdAdBdCdDdEgd
gdF  ƒ dS )GzTest splitting labels.r,   r-   r7   ÚlingualrÓ   r   Zbad_input_string)Zlingual_postZlingual_antrª   r5   é(   NTrˆ   éÒ   i1  ií  i//  i”?  iJ  iôf  iÉ  iÌ  iÏ  iÏŒ  iÒŒ  i-§  i.§  i/§  i‘ç  i’ç  i“ç  i¸ i¹ iº iÂ iË i8 i8 i&8 ip’ iI¥ iJ¥ i0à i\  i]  im  in  io  ip  iq  ir  iu  i}F i~F i€F i‡F zlingual_div40-lhr+   zlh.7Networks_7.labelÚ
contiguous)Úpartsr@   rU   c                 S   s   g | ]}t |jƒ‘qS r=   )r:   rJ   r¬   r=   r=   r>   r?   ¼  s     z$test_split_label.<locals>.<listcomp>i5?  in  iM  i´  i7  é   )r   rU   rz   r{   rG   Úsplitr   r   rœ   r_   rA   rf   r   rJ   r   rD   rE   )r-   rï   ró   ÚpostÚantZlingual_reconstZpost1Zant1ZantmostZfs_vertZlabel_default_modeZDMN_sublabelsr=   r=   r>   Útest_split_label‹  s†     ÿ


                              üÿþÿrø   c               	   C   sX  t tƒ} t tƒ}ttdƒ}t td¡tj	d< t
|ddd�}t
|| dd�}tt|ƒt|ƒƒ t||ƒD ]\}}t||dd� qdtjtdd	�� t|| d
d
d�\}}W 5 Q R X tjtt|dd
d
d� tjtt|d
|d
d� tt|ƒdƒ tt|ƒdƒ |d j| d d |jd d�}	tjtt|	dd� t|	d
d�}
|
jd t|jd ƒk�sNt‚tjtt|dddtd� tjtt|t| d gƒddtd� tjtt|ddd
td� tjtt|dd
dtd� t|dddtd�\}}t|ƒdk�sàt‚t|ƒdk�sòt‚tjtdd	�� t|| d
d�}W 5 Q R X t|ƒt|ƒk�s0t‚t||ƒD ]\}}t||dd� �q:dS )zTest stc_to_label.r)   r(   ZSUBJECTS_DIRrp   )rS   rT   é   )rc   z
have holesr‰   T)rS   rT   Ú	connected)rT   rú   )rT   rS   rú   r5   r   Zuse_tris)rJ   F)Zremap_vertices)rS   rT   rú   rU   N)r   Ú	fwd_fnameÚsrc_bad_fnamer   r•   rD   rE   Ú	data_pathr·   ÚenvironrZ   r   r:   rI   rf   rz   ræ   rç   r   r{   rG   rÊ   Zget_trisrJ   r   rK   rl   rF   rU   r    )rS   Zsrc_badrR   Zlabels1rë   rb   r   rÖ   r×   r6   Z	adjacencyZlabels_patchr=   r=   r>   Útest_stc_to_labelÀ  sn    
ÿÿÿ 
ÿ ÿ  ÿ ÿ ÿþ
rÿ   c               
   C   s†  t tƒ} d| _tƒ }dt d¡t d¡gt d¡fD ]’}|  ¡ }t t	|j
dd¡ |j d¡ | 
ddd|td¡}| 
ddddtd¡}t | j|j¡ ¡ sžt‚t|jƒdt| jƒ k sºt‚| |j¡ q4t|d	 |d ƒ t|jdƒ t d¡t d¡g}d
D ]0}||_tƒ � | 
ddd|td¡ W 5 Q R X qþt t|j
ddd|td¡ t t|j
ddd|td¡ tƒ � |jtd� W 5 Q R X dS )z"Test inter-subject label morphing.r)   r[   i(  r,   r5   Nr3   rp   r   rá   g      @rª   )r   r�   r@   ry   rM   rx   rh   rz   r{   rG   Zmorphr^   rŽ   rU   r�   rJ   rÍ   rl   r:   rQ   r   r   rV   r&   rF   rT   )Z
label_origÚvalsZgrader+   ZvertsrV   r=   r=   r>   Ú
test_morphø  s:    $  ÿ ÿr  c               	   C   s†  ddg} ddgddgg}ddg}dd	g}t d
| d|t|d�}ddg}ddg}t|| |||ƒD ]R\}}}	}
}t |j|k¡s~t‚t t |
|j¡¡s–t‚t	|j
|	ƒ t	|j|ƒ q\dddgg} t d| dddgtƒ\}}dddgg} t d| dddgtdd�\}}t	|jdƒ t	|jdƒ t	|jdƒ t	|jdƒ t d| dddgtddd�\}}t	|jtdƒd ƒ t	|jtdƒd ƒ t ddddgddddgg¡}t d| dddgtd|d�\}}t|j|ddd…f ƒ t|j|ddd…f ƒ t dddd g¡}t d| dddgtd|d�\}}t|j|ƒ t|j|ƒ t |j|jd!¡}t|g ƒ || }|| }t|j|jƒ d"D ]}t ddgddt|d� �qddS )#z*Test generation of circular source labels.r   iPÃ  é1   éã   iÈ  iš¾  r5   ZaneurismZtumorr)   rp   )rØ   zaneurism-lhztumor-rhr7   r8   i¼à  iæ  i   r,   é   F)Úoverlapz
Label_0-lhz
Label_1-lhN)r  rX   r3   gš™™™™™¹?gš™™™™™É?g333333Ó?gÍÌÌÌÌÌì?T)FT)r   rU   rI   rM   rN   rJ   rl   rÍ   r�   r   rV   rœ   rA   r   r�   r   Úintersect1d)ZseedsZshould_be_inÚhemisrØ   r*   Z	tgt_namesZ	tgt_hemisr+   ÚseedrV   Úshrœ   r€   r�   Zl11Zl12Zl11_cZl12_cZ
lab_colorsr  ra   rb   r=   r=   r>   Útest_grow_labels  sh     ÿÿ
 ÿ
 ÿ
 ÿ

r
  c                  C   sø   d} d}d}d}t j d¡}t||| t||d�}tt|ƒ|ƒ | dkrNddg} t  | ¡}t|ƒD ]’} g }|D ].}|j	| krlt|j
ƒdksŒt‚t  ||j
¡}qlttt  |¡ƒt|ƒƒ t t|d	| d
 | ¡}	t|	ƒ\}
}tt  |¡t  t|
ƒ¡ƒ q`dS )z0Test generation of random cortical parcellation.ru   rä   z
sphere.regZ	sample_dsr   )ÚsurfaceZrandom_stater7   r8   r0   Ú.N)rM   rv   rw   r   rU   r   r:   Z
atleast_1dÚsetrV   rJ   rl   rQ   r~   rD   rE   r   r   rÛ   rx   )rV   Zn_parcelr  r@   Úrngr*   r  Zvertices_totalr+   Z
surf_fnameZvertÚ_r=   r=   r>   Útest_random_parcellation[  s2    
 ÿ

ÿr  c                  C   sÔ  t tƒ} t| d d dd… dd�}t dddgdddgdddgdt d	¡ dt d	¡ dgdt d	¡ dt d	¡ dgg¡| d d
 |j< t ddtjddg¡}ddddg}t|| ƒ}t	t 
|| || ¡t|ƒƒ |t| d d dd… dd� }| d d
 |j  | d d
 | d d dd… < t|| ƒ}t ddtjddddtjddg
¡}ddddddddg}t	t 
|| || ¡dƒ | d d
 | d d dd…   d9  < t|| ƒ}t	t 
|| || ¡t|ƒƒ dS )z!Test label sign flip computation.r   ÚvertnoNr[   r7   )rJ   rV   rã   ç        r3   Únnr5   rp   rù   r8   rt   é   é	   rˆ   )r   r‹   r   rM   r�   ÚsqrtrJ   Únanr   r   Údotr:   )rS   r+   Zknown_flipsrì   ÚflipZbi_labelr=   r=   r>   Útest_label_sign_flip‚  s.    üÿ
 0
"(
r  c                  C   s  t tƒ} d| jdd…< | jdtd�d }t|dƒ t| jd d| jj	dd�ddd	�}|jtd�}t||ƒ t
dd
td�}ttƒ}t|d |d |d gdddgƒD �]2\}}d|jdd…< tjt|jtd� d|jdd…< tjt|jtd� d|jdd…< t|jtd�|ƒ t|jt|jd�|ƒ |jdk�r2dnd}|jt |j|k¡d d  }|| d || d  | }t tj|| dd�¡}|| d | }	t |j|| d ¡}
t|jt|
d�|	ƒ t|jt|d�|	ƒ q¢tjt|jtdd� tjt|jtdd� tjt|jtdd� dS )z-Test computing the center of mass of a label.r   Nr)   rª   iwç r5   r9   r8   )r]   r^   rV   r@   rÑ   )rÁ   rU   r3   rp   éûÿÿÿij' iE7 i«Ú  rˆ   )rU   Zrestrict_verticesr7   r4   r  rs   )rU   r0   )r   r•   Zlh_dataZcenter_of_massrU   r   r   rJ   Zrh_datarÉ   r   r   r‹   rI   r^   rz   r{   rG   rV   r]   rM   rP   Zargminr¾   r  rF   r¼   )rR   Z
vertex_stcr+   Zvertex_labelr*   rS   Úexpectedrì   r]   Zsrc_expectedZsrc_restrictr=   r=   r>   Útest_label_center_of_massœ  sr    
 ÿ
ÿÿ
ÿ
ÿÿþÿþÿþÿÿÿr  c            	   	   C   sl  d} t  t| ddd¡}t|ƒ}d|jdd…< d|g}dd	g}t||ƒD ],\}}t| ||d
td�}t|jƒdksFt	‚qFt| dd
d
td�}t
ddƒD ]D}t| dd
|d td�}t|jƒt|jƒksÂt	‚|jdksÐt	‚|}q�t| |d
ddtd�}t|jƒt|jƒk�st	‚t| |d
ddtd�}t|jƒt|jƒk�s2t	‚t| |d
ddtdd�}|jdk�sXt	‚|jdk�sht	‚dS )z-Test the selection of sources for simulation.r)   r+   r-   ztemporalpole-rh.labelr5   Nr7   rv   Úcenterr   )ÚextentrU   rp   r3   é   F)r  Úgrow_outsiderU   Tro   Úmne)r  r!  rU   rœ   r8   )rD   rE   rU   r   r^   r   r   r:   rJ   rl   rO   r  rV   rœ   )	r@   Z
label_fileZtp_labelr*   Ú	locationsr+   Úlocationr  Z	new_labelr=   r=   r>   Útest_select_sourcesÓ  sX    ÿ    ÿ
ÿÿ
 ÿ
 ÿ
 þr%  zfname, areagTs¹ÁP‡E?g…BB•j?c              	   C   s�  t | dd�}|jtd�}t||dd� | t¡}dt|jƒ  k rPt|jƒk sVn t‚t	j
tdd�� |jtd�d	kszt‚W 5 Q R X td
dƒs¢t	jtdd�}d}n
tƒ }d}|� |jtd�\}}W 5 Q R X |rÔdS tt tddd¡ƒ\}	}
t t|	ƒt¡}d||j< t |jt|
|ƒ¡}t || d¡\}}}d|  k �rxd  k �rx|  k �rxd  k �rx|  k �rxdk �s~n t‚t ||  d¡\}}}d|  k �rÞd  k �rÞ|  k �rÞd  k �rÞ|  k �rÞdk �sän t‚t ||j¡ ¡ �rüt‚|| }dtjj|	|j|  |	||   dd� }t||dd� ||  }dtjj|	|j|   |	||    dd� }t||ƒ td| |ƒ dS )z"Test label geometric computations.r)   rk   rª   gü©ñÒMbP?)Zrtolr   zNo complete trianglesr‰   r  r†   r‡   zrequired to calculateTFNr0   r1   r5   )r   rä   rÅ   g-Cëâ6?gü©ñÒMb@?gü©ñÒMb`?g;ßO�—n‚?gš™™™™™™?r9   )Zatolg      Ð?)r   Zcompute_arearU   r   rŒ   r‹   r:   rJ   rl   rz   ræ   rç   r%   r{   rÊ   r   Zdistances_to_outsider   rD   rE   rM   ZzerosÚboolr�   r"   Z
percentilerN   ZlinalgZnormr	   )r…   Zarear+   Zgot_areaZlabel_sparseÚctxÚstopÚdistZoutsider4   r6   ÚmaskZborder_maskÚloÚmiÚhiZborder_distZ
border_eucZinside_distZ
inside_eucr=   r=   r>   Útest_label_geometry  sP    
&
ÿ
NN ÿ
 ÿ
r.  )N)r[   TT)F)fÚ
contextlibr   rÚ   Ú	itertoolsr   r·   Úos.pathr¸   rD   rŸ   r»   ÚnumpyrM   r†   r   Znumpy.testingr   r   r   r   r	   rz   Zmne.datasetsr
   r"  r   r   r   r   r   r   r   r   r   r   r   r   r   Z	mne.labelr   r   r   r   r   r   r   r   Zmne.source_spacer    Zmne.source_estimater!   Zmne.surfacer"   Z	mne.utilsr#   r$   r%   r&   rý   rE   rU   r‹   r•   r�   Zreal_label_rh_fnameZv1_label_fnamerû   rü   r¿   rõ   Ú__file__Z	test_pathrg   Zlabel_rh_fnamerZ   rf   ri   rn   r„   Zrequires_testing_dataÚmarkZparametrizer”   r™   r§   r©   rÄ   rÌ   rÏ   rÙ   rÜ   rî   rø   Zslowtestrÿ   r  r
  r  r  r  r%  r.  r=   r=   r=   r>   Ú<module>   s¶   <(
ÿÿÿ
ÿÿ

Y

E)





4


=

}35!
?
&

6
/þ