U
    f»{j-§  ã                   @   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 d dlmZ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mZm Z m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z'm(Z( d d	l)m*Z*m+Z+m,Z, d d
l-m.Z.m/Z/ d dl0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 d dl$m9Z9 e#j:dd�Z:e ;e:dd¡Z<e ;e:d¡Z=e ;e<d¡Z>e ;e<d¡Z?e ;e<d¡Z@e ;e<d¡ZAe ;e<d¡ZBe ;e<d¡ZCe ;e=ddd¡ZDe ;e:ddd¡ZEe ;e<d¡ZFe ;e=ddd¡ZGe ;e=ddd¡ZHe ;e=ddd ¡ZIe ;e=ddd¡ZDe ;e=d!dd"¡ZJe ;e=d!dd¡ZKe ;e<d¡ZLd#d$„ ZMd%d&„ ZNe#jOd'd(„ ƒZPe#jOd)d*„ ƒZQe#jOejR Sd+dd,d-d eTfd.d/d0d1eUfd2d3d4d eTfg¡d5d6„ ƒƒZVe#jOd7d8„ ƒZWdsd:d;„ZXe5d<ƒe#jOd=d>„ ƒƒZYe5d<ƒe3ƒ e6ƒ ejRjZe#jOd?d@„ ƒƒƒƒƒZ[e5d<ƒe3ƒ e6ƒ ejRjZe#jOejR SdAdd!dBdCeTdfd!d!dDdEeTdfdddDdEeUdfdddDdEeTdFfdd!dGdHeTdFfg¡dIdJ„ ƒƒƒƒƒƒZ\ejRjZe#jOdKdL„ ƒƒZ]e#jOdMdN„ ƒZ^e3ƒ e#jOejR SdOe_d dPƒdQdRdSfe_dPd1ƒdTdUdHfe_d d1ƒdVdWdXfg¡dYdZ„ ƒƒƒZ`ejad[e# b¡ gd\�d]d^„ ƒZce3ƒ e6ƒ ejRjZejR Sd_d`¡dadb„ ƒƒƒƒZddcdd„ ZedeZfd1d d dPgd d dPdfgd dfd d1gd d d dPgge dg¡e dg¡d d1dPd.g dhfZge3ƒ e5didjƒejR Sdkef¡ejR Sdleg¡ejR Sdmef¡ejR Sdneg¡ejR Sdod dPg¡ejR Sdpd dPg¡dqdr„ ƒƒƒƒƒƒƒƒZhdS )té    N)Úassert_array_lessÚassert_allcloseÚassert_array_equal)Úcdist)Ú
csr_matrixÚeye)ÚSourceEstimateÚVolSourceEstimateÚVectorSourceEstimateÚread_evokedsÚSourceMorphÚcompute_source_morphÚread_source_morphÚread_source_estimateÚread_forward_solutionÚgrade_to_verticesÚsetup_volume_source_spaceÚmake_forward_solutionÚmake_sphere_modelÚmake_ad_hoc_covÚVolVectorSourceEstimateÚget_volume_labels_from_asegÚread_freesurfer_lut)Útesting)Ú_get_img_fdata)Ú_get_mri_info_dataÚ_get_atlas_values)Úapply_inverseÚread_inverse_operatorÚmake_inverse_operator)Ú_add_interpolatorÚ_grid_interp)Úquat_to_rot)Úrequires_nibabelÚcheck_versionÚrequires_versionÚrequires_dipyÚcatch_loggingÚ_record_warnings)Ú	_get_argsF)ÚdownloadZMEGÚsampleZsubjectszsample_audvis-ave.fifzsample_audvis_trunc-trans.fifz)sample_audvis_trunc-meg-vol-7-meg-inv.fifz%sample_audvis_trunc-meg-vol-7-fwd.fifz0sample_audvis_trunc-grad-vol-7-fwd-sensmap-vol.wz-sample_audvis_trunc-meg-eeg-oct-6-meg-inv.fifÚmrizaseg.mgzzfsaverage_audvis_trunc-megzsample_audvis_trunc-megzT1.mgzÚbemzsample-volume-7mm-src.fifú	brain.mgzÚ	fsaveragez"fsaverage-vol7-nointerp-src.fif.gzc                  C   s.   t tƒ} ttdd�d  dd¡}t|| dd�S )N)Nr   )Zbaseliner   ç{®Gáz„?Úvector)Zpick_ori)r   Úfname_inv_surfr   Úfname_evokedÚcropr   )ÚinvÚevoked© r7   úS/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/tests/test_morph.pyÚ_real_vec_stc>   s    r9   c                   C   s"   t tjƒdd… tjjkst‚dS )z#Test SourceMorph class consistency.é   éÿÿÿÿN)r)   r   Ú__init__ÚmneÚmorphZ_SOURCE_MORPH_ATTRIBUTESÚAssertionErrorr7   r7   r7   r8   Útest_sourcemorph_consistencyD   s    ÿr@   c                  C   sî  t j d¡} t  |  t  d¡¡dd… ¡t  |  t  d¡¡dd… ¡g}|  dd¡}t||dddƒ}d	d
„ dD ƒ}dd
„ dD ƒ}t|ddddt	d�}| 
|¡}d}tƒ }	t|j||j|ƒD ]b\}
}}}t||
 || ƒ}t j|dd�}t|t  t|ƒ¡|f dƒ |	 || ¡ |t|ƒ7 }qºt|j|jt  |	¡ ƒ t|ddddt	d�}| 
|¡}d}tƒ }	t|j||jƒD ]b\}
}}t||
 || ƒ}t j|dd�}t|t  t|ƒ¡|f dƒ |	 || ¡ |t|ƒ7 }�qnt|j|jt  |	¡ ƒ dS )zTest sparse morphing.r   é(  Né   é   é
   r:   r/   c                 S   s*   g | ]"}t  t td dd| ¡¡d ‘qS )r/   Úsurfú%s.sphere.regr   ©r=   Zread_surfaceÚopÚjoinÚsubjects_dir©Ú.0Zhemir7   r7   r8   Ú
<listcomp>R   s   þ   ÿÿz%test_sparse_morph.<locals>.<listcomp>)ZlhZrhc                 S   s*   g | ]"}t  t td dd| ¡¡d ‘qS )r+   rE   rF   r   rG   rK   r7   r7   r8   rM   U   s   þ   ÿÿr+   T)ÚsparseÚspacingrJ   r;   ©Zaxisg      ø?)ÚnpÚrandomÚRandomStateÚsortZpermutationÚarangeÚrandnr   r   rJ   ÚapplyÚlistÚzipÚverticesr   Zargminr   ÚlenÚappendr   ÚdataÚconcatenate)ÚrngZvertices_fsr]   Ústc_fsZ
spheres_fsZspheres_sampleZmorph_fs_sampleZ
stc_sampleÚoffsetZordersZv1Ús1Zv2Ús2ÚdistsÚorderZmorph_sample_fsZstc_fs_returnÚsr7   r7   r8   Útest_sparse_morphJ   sf    ÿþþ    þ
 ÿ    þ
rg   c               
   C   sB  t tdd�} d}d}d}t| dd|d|td� | ¡} t| dddd	d| jd
 g gtd�}| | ¡}|jjd
 |kstt‚|j	jd
 d
ksˆt‚t
|jd ƒd
ksžt‚|jjd
 |ks²t‚t
|jd
 ƒ|ksÈt‚t| dd|d	d| jtd�}|j}|j|d fd k�st‚|j|d k�st‚|d|…d|…f jd
k�s6t‚||d…|d…f jd
k�sVt‚||d…d|…f j|k�svt‚|d|…|d…f j|k�s–t‚| jd
 t d¡g}t
|d ƒ}|d
 j|fk�sÌt‚|d j|fk�sât‚t |d | jd ¡ ¡ dk �st‚t| dd|d	d|td�}|j}|j|| |d fk�s@t‚|d|…d|…f jd
k�s`t‚||d…|d…f jd
k�s€t‚|d|…|d…f j|k�s t‚||d…d|…f j|k�sÀt‚| | ¡}t|dd|d	d| jtd�}| |¡}	tdƒD ]}
t|	j|
 | j|
 ƒ �qöt | j ¡ |	j ¡ ¡d }|dk�s>t‚dS )zTest cross-hemisphere morphing.r+   ©ÚsubjectrB   i
  Zfsaverage_symF)ÚsmoothÚwarnrO   rJ   r:   Tr   )rj   Úxhemirk   rO   rJ   é   NrA   g333333Ó?©r   r:   gÍÌÌÌÌÌì?)r   Ú	fname_stcr   rJ   rW   rZ   r]   Úshaper?   Zrh_datar[   Zlh_dataÚ	morph_matÚsizerQ   rU   Úin1dÚmeanÚranger   ÚcorrcoefÚravel)Ústcrj   rO   Zn_grade_vertsr>   Z	stc_xhemiÚmmZvertices_useZn_src_vertsZ
stc_returnÚhiZcorrelationr7   r7   r8   Útest_xhemi_morphv   sª         þþ     ý
      þ    $      þ    
     ý
r{   z#smooth, lower, upper, n_warn, dtypegã¥›Ä °î?g7‰A`åÐî?é   g`åÐ"Ûùî?gßO�—nï?rm   Únearestç\�Âõ(\ï?g®Gáz®ï?c              	   C   sf  t | dtd�}t t¡}|tkr:d|j |_t|jjdƒ | dkrzt	ddƒszt
jtdd	�� t|d
df|Ž}W 5 Q R X dS tƒ �}t|d
df|Ž}W 5 Q R X dd„ |D ƒ}t|ƒ|ksºt‚|jjdt|jƒfksÔt‚| |¡}	t|	dd
fd|ji|—Ž}
|
jjt|jƒdfk�st‚|
 |	¡}t |j ¡ |j ¡ ¡d }||  k�rR|k�sXn t‚t||ƒ dS )z-Test round-trip morphing yields similar STCs.T)rj   rk   rJ   ù              ð?ç        r}   Zscipyú1.3zrequired to use nearest©Úmatchr+   r/   Nc                 S   s   g | ]}d t |jƒkr|‘qS )zvertices not included)ÚstrÚmessage)rL   Zwwr7   r7   r8   rM   Æ   s      z8test_surface_source_morph_round_trip.<locals>.<listcomp>iP  rO   rn   )ÚdictrJ   r=   r   Úfname_smorphÚcomplexr]   r   Úrealr$   ÚpytestÚraisesÚ
ValueErrorr   r(   r[   r?   rq   rp   rW   rZ   rQ   rv   rw   Úassert_power_preserved)rj   ÚlowerÚupperZn_warnÚdtypeÚkwargsrx   r>   Úwr`   Z
morph_backÚstc_backZcorrr7   r7   r8   Ú$test_surface_source_morph_round_trip³   s:    

  ÿÿÿ
r”   c                  C   st   t  t¡} t| dd| jdtd�}| | ¡}t|j| jdd� |j	t
t| jƒdd� }t |j¡ ¡ }|dk spt‚dS )	z*Test that our shortcut for smooth=0 works.r+   r   ©rO   rj   rJ   g-Cëâ6?)ZrtolZcsc)ÚformatN)r=   r   r‡   r   rZ   rJ   rW   r   r]   rq   Úspeyer[   rQ   ÚabsÚsumr?   )rx   Zmorph_identityr“   Zabs_sumr7   r7   r8   Ú"test_surface_source_morph_shortcutÔ   s    
    þ
rš   ©ç      ð?gÍÌÌÌÌÌð?c           
      C   sŽ   d}dD ]€}t j t| j|ƒ¡}t j t|j|ƒ¡}||  krHdkrNq nq|| }|\}}	||  k rr|	k sn td|› d|› �ƒ‚qdS )z=Assert that the power is preserved during a round-trip morph.T)r‰   Úimagr€   zPower ratio z = N)rQ   ÚlinalgÚnormÚgetattrr]   r?   )
ÚorigÚnewÚlimitsZ__tracebackhide__ÚkindZnumerÚdenomZpower_ratioZmin_Zmax_r7   r7   r8   r�   â   s    r�   Zh5ioc           	   	   C   s   t tƒ}ttdd�}| dd¡ tƒ }t|d tddd�}|jdksHt	‚|j
d	ksVt	‚|jd
ksdt	‚t|jtƒstt	‚t|jd tƒsˆt	‚t|tƒs–t	‚| |¡}t|tƒs®t	‚| |¡}tjtdd�� |j|dd� W 5 Q R X t|tƒsît	‚t|tƒsüt	‚d
t|ƒk�st	‚| | d ¡ t| d ƒ}tdd„ tt|jƒt|jƒƒD ƒƒ�sRt	‚d|_t| |¡tƒ�snt	‚ttdƒ}tjt dd�� | |¡ W 5 Q R X dS )z.Test surface and vector source estimate morph.r+   rh   ç
×£p=
·?çš™™™™™¹?Úsrcr:   F)rJ   rj   rk   r/   ÚsurfaceZvertices_fromzInvalid value for the 'output'r‚   Únifti1©Úoutputz42.h5c                 S   s   g | ]\}}||k‘qS r7   r7   ©rL   ÚreadZsavedr7   r7   r8   rM     s     z4test_surface_vector_source_morph.<locals>.<listcomp>Nústc_from must be an instance)!r   r2   r   r‡   r4   r9   r   rJ   Úsubject_fromr?   Ú
subject_tor¤   Ú
isinstanceÚsrc_datar†   rX   r   rW   r   rŠ   r‹   rŒ   r
   ÚreprÚsaver   ÚallrY   ÚsortedÚ__dict__ri   Úfname_vol_wÚ	TypeError)	Útmp_pathZinverse_operator_surfÚstc_surfÚstc_vecZsource_morph_surfZstc_surf_morphedZstc_vec_morphedZsource_morph_surf_rÚstc_volr7   r7   r8   Ú test_surface_vector_source_morphï   sH      þ


ÿÿ
r¿   c              
   C   sR  ddl }ttƒ}ttdƒ}tjtdd�� tdd� W 5 Q R X |d }|j	dksTt
‚tjtd	d��, tjtd
d�� t|td� W 5 Q R X W 5 Q R X d|d d< tjtdd�� t|tdd� W 5 Q R X tjtdd�� t|dtd� W 5 Q R X d}t|ddd�}tf ttddœ|—Ž}d}|jdk�s,t
‚t|jjƒ|k�sBt
‚t|jjƒ|k�sXt
‚t|j|fd ƒ |d d |d d |d d f}	|jd |	k�s t
‚ttƒ}
d|
d d d< t|
d ddfdti|—Ž}tjtdd�� t|
d ddtd� W 5 Q R X | | d  ¡ t| d! ƒ}tjtd"d�� t| d ƒ W 5 Q R X | |¡}t |j d |j d ¡�rjt
‚t!t "|j#dd…tj$f d#¡|j dd$ƒ}| |¡}t%|t!ƒ�s¬t
‚t&dƒD ] }t'|j#dd…|f |j#ƒ �q´t%|j|d%d&�|j(ƒ�sòt
‚d|_tjtd'd�� | |¡ W 5 Q R X |j|d(d&�}t%||j)ƒ�s<t
‚|j* +¡ dd… |fd k�s^t
‚|j|d(dd)�}t%||j)ƒ�s€t
‚|j,|d d |d d |d d f|j,d f k�sºt
‚|j|d(d*d)�}t%||j)ƒ�sÜt
‚|j* +¡ dd… d*k�søt
‚t%|t-ƒ�st
‚t.d+d,„ t/t0|j1ƒt0|j1ƒƒD ƒƒ�s2t
‚d-t2|ƒk�sDt
‚t%|j|ddd%d.�|j(ƒ�sdt
‚tjtd/d�� |j|d$d&� W 5 Q R X tjtd0d�� t|dd1� W 5 Q R X tjtd2d�� |j|dd&� W 5 Q R X tjtd3d�� t|ddtd� W 5 Q R X tjtd4d�� |j3|d d5d6� W 5 Q R X tt4dƒ}tjtd7d�� | |¡ W 5 Q R X t|
d fd|
d dtd8œ|—Ž}| |¡}t|j d |j d ƒ t-|j#dd9… |j d dd9… g|j5|j6ƒ}d:}tjt|d�� | |¡ W 5 Q R X |j|d(d&�}|j3|
d d;d<�}t'|j7|j7ƒ | 8¡ }| 8¡ }|j,|j,k�sDt
‚t'||ƒ dS )=z@Test volume source estimate morph, special cases and exceptions.r   Nr+   zsrc must ber‚   é*   ©r¨   r¨   z"subject_from could not be inferredzrecommend regenerating)r¨   rJ   Úsubject_his_idzInter-hemispheric morphingT)r¨   rJ   rl   zOnly surface.*sparse morph)r¨   rN   rJ   é   ©r:   )ÚzoomsÚ	niter_sdrÚniter_affine)rJ   r¨   r°   )é   rÈ   rÈ   r|   Z
mri_heightZ	mri_depthZ	mri_widthZsrc_shape_fullrJ   zcannot read fileZ42)rJ   Zvolzvol-morph.h5z	not found)r:   r|   r:   r:   Znifti2r«   zsubject_from must matchrª   )r¬   Úmri_resolution)ç      @rÊ   rÊ   c                 S   s   g | ]\}}||k‘qS r7   r7   r­   r7   r7   r8   rM      s     z2test_volume_source_morph_basic.<locals>.<listcomp>Úvolume)rÉ   Z	mri_spacer¬   zoutput must beúsubject_from does not match)r¨   r°   r¬   zsubject_to cannot be Nonez Cannot infer original voxel sizerB   ©rÉ   r¯   )r°   Úsrc_tor±   rJ   r;   z�vertices do not match between morph \(4157\) and stc \(4156\).*
.*
.*
.*Vertices were likely excluded during forward computatio.*F)r¨   rÉ   )9Únibabelr   Úfname_inv_volr   r¹   rŠ   r‹   rº   r   Z_subjectr?   rŒ   ÚwarnsÚRuntimeWarningrJ   r†   r°   ÚtupleZ	sdr_morphZdomain_shapeÚ
pre_affiner   rÅ   r³   r   Úfname_fwd_volÚIOErrorrµ   r   rW   rQ   Zarray_equalrZ   r   Ztiler]   Znewaxisr²   ru   r   ZNifti2ImageÚNifti1ImageÚheaderZ	get_zoomsrp   r	   r¶   rY   r·   r¸   r´   Ú	as_volumero   ÚtminÚtstepÚaffineÚ	get_fdata)r»   ÚnibZinverse_operator_volr¾   r¨   rÅ   r‘   Zsource_morph_volrp   Zmri_sizeÚfwdZsource_morph_vol_rZstc_vol_morphedZstc_vol_vecZstc_vol_vec_morphedÚiiZimg_morph_resZimg_mri_resZimg_any_resr¼   Z	stc_vol_2Zstc_vol_badrƒ   Zimg_volZ	img_vol_2r7   r7   r8   Útest_volume_source_morph_basic#  s   
  þþ"  ÿÿþÿ
  þ
ÿ
"ÿ
ÿ
þÿ
ÿÿ ÿý
ÿ
ÿ  þþ
  þÿrá   z8subject_from, subject_to, lower, upper, dtype, morph_matgš™™™™™@gffffff@r€   r§   TrD   é   c           ,   
   C   sÚ  ddl }ddlm}	 tƒ }
|r¸tttƒƒdd… }d||fkrptdt|td�|
d< t	dd	„ |
d D ƒƒd
kspt
‚d||fkr¶tdt|dd… td�|
d< t	dd	„ |
d D ƒƒdks¶t
‚n²|rÀt
‚d||fk�rt t¡|
d< d|
d d d< |
d d d dk�st
‚d||fk�rjt t¡|
d< |
d d jt dddg¡dd� t|
d ƒ |
d d d dk�sjt
‚|
| |
|  }}~
tddtdd�}tf |||dœ|—Ž}tf |||dœ|—Ž}t	dd	„ |D ƒƒ}|dk�sÚt
‚t d|d d¡ ¡  t¡}t |¡dd…|f }|tk�r|d }d d!„ |D ƒ}t||ddƒ}tƒ �}| |j|d"d#�¡}W 5 Q R X | ¡ }d$|k�svt
‚tj|j dd%�}t !d&d!„ |D ƒ¡}d'tj"j#|| ||  dd%� }t $|¡}||  k�rÜ|k �sìn t
d(|› �ƒ‚||k�r||fD ]}t%|j&j't d)¡d*d+� �qþ|�r:|dk�r4d,}nd-}nd.}| (¡  )dd¡}|j* +d/¡ | | |¡¡}t,|||d0� |�rœ| d1 } | -| ¡ t.| ƒ}|j/dk�s¨t
‚|j0dd#� |j-| dd2� t.| ƒ}t1|j/t2ƒ�sàt
d3ƒ‚|j/dk�sðt
‚| 3tj4d4d5¡ tƒ �4}t5j6t7d6d7�� | |j|d"d#�¡}!W 5 Q R X W 5 Q R X t1|j/t2ƒ�sVt
d3ƒ‚| ¡ }d8|k�slt
‚t%|j |!j ƒ ~!| | |¡¡}"t%|j |"j ƒ ~"~~| 8t9 :t|d9d:¡¡}#t;|#ƒdk}$||  k�rÚdk�rÖn nø||fD ]î}%|%j<|dd;�}&| =t >t;|&ƒdd…dd…dd…df ¡|&j'¡}&t;|	|&|#dd<�ƒ}&|&j?|$j?k�sLt
‚|&|$  t@¡ $¡ }'|&|$   t@¡ $¡ }(|�r†d=})d>\}*}+nd?})d@\}*}+|(|)k �sªt
dA|(› �ƒ‚|*|'  k �rÂ|+k �sæn t
dB|'› �ƒ‚�qædS )Cz3Test volume source estimate morph round-trips well.r   N©Úresample_from_tor:   rm   r+   ©rJ   Úvolume_labelr,   c                 s   s   | ]}|d  V  qdS ©ÚnuseNr7   ©rL   rf   r7   r7   r8   Ú	<genexpr>ø  s     z6test_volume_source_morph_round_trip.<locals>.<genexpr>râ   r/   r|   c                 s   s   | ]}|d  V  qdS rç   r7   ré   r7   r7   r8   rê   ý  s     é   rÂ   rè   i=  é   é   é   Úbrain)Zvol_dimsÚseg_nameië  r7   rÄ   T)rÆ   rÇ   rJ   Úverbose)r¨   rÎ   r±   c                 s   s   | ]}|d  V  qdS rç   r7   ré   r7   r7   r8   rê     s     rD   r   c                 S   s   g | ]}|d  ‘qS ©Úvertnor7   ré   r7   r7   r8   rM   $  s     z7test_volume_source_morph_round_trip.<locals>.<listcomp>Údebug)rñ   zindividual volume morphrP   c                 S   s   g | ]}|d  |d  ‘qS )Úrrró   r7   ré   r7   r7   r8   rM   ,  s     iè  zround-trip distance rB   r0   ©Zatol)é   g     €2@)é   g      @)r:   g333333ó?rœ   )r£   ztemp-morph.h5)Ú	overwriteZcsrZ_VOL_MAT_CHECK_RATIOr€   zcalling morph\.computer‚   zsparse volume morph matrixr,   r.   rÍ   ©re   gü©ñÒMbP?)g{®Gázt?gyé&1¬|?g{®Gáz”?)g
×£p=
ï?r~   zproportion out of volume zproportion inside volume )ArÏ   Únibabel.processingrä   r†   r·   r   Ú
fname_asegr   rJ   r™   r?   Úfname_aseg_fsr=   Úread_source_spacesÚ	fname_volÚfname_fs_volÚupdaterQ   Úarrayr    r   ZlinspaceÚroundÚastypeÚintr   rˆ   r	   r'   rW   ÚgetvalueZargmaxr]   r^   rž   rŸ   rt   r   rÔ   rÜ   Úcopyr4   Ú_dataÚfillr�   rµ   r   Úvol_morph_matZcompute_vol_morph_matr²   r   Úsetattrr>   rŠ   rÑ   rÒ   ÚloadrH   rI   r   rÙ   r×   r˜   rp   Úbool),r»   r°   r±   rŽ   r�   r�   rq   ZmonkeypatchrÞ   rä   r¨   Úlabel_namesrÎ   Zsrc_fromr‘   Zmorph_from_toZmorph_to_fromrè   Zuser]   rZ   Ústc_fromÚlogZstc_from_rtZmaxsZsrc_rrrd   Úmur>   r£   Zstc_from_unitZstc_from_unit_rtÚfnameZstc_from_rt_linZstc_from_unit_rt_linrï   Úmaskrx   ÚimgZin_ÚoutZout_maxZin_minZin_maxr7   r7   r8   Ú#test_volume_source_morph_round_tripÜ  s     þ
 
 þ
  ÿ ÿ  ÿÿ  ÿÿ
ÿ 
(
  ÿ


ÿÿ$ ÿ
r  c               	   C   s^  d} d}t tdd�}t tƒ}| dd¡ | dd¡ t|jddgdd�dt|jƒd	 gƒ t|d
d|t	dd�}|j
dks|t‚| |¡}t|j|jdd� |jjdd�}|jjdd�}t ||¡ ¡ dksÌt‚t|d
t	d�}tjtdd�� t|| |dd	t	d�}W 5 Q R X | |¡}	|	jjd dk�s(t‚tƒ }
t|
| |t	|d	dd� |
¡}|j|k�sZt‚|j|
jk�slt‚|j|
jk�s~t‚t|jƒdk�s’t‚t|jƒdk�s¦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!t	d"� W 5 Q R X tjtd#d�� t|| |d gt	d$� W 5 Q R X dS )%zTest morphing stc.r+   r/   rh   r¦   r§   T)Zuse_roundingr   r:   r|   râ   )r±   rO   rj   r¨   rJ   Z
precomputeNgñhãˆµøä>rö   rP   g+‡ÙÎ÷ï?)ZgraderJ   zconsider increasingr‚   r•   i  F)rJ   rO   rj   rk   i‚  zCannot use icosahedral grade 6 rC   )r°   r±   rO   rJ   zsmooth.* has to be at least 0é   r;   rÌ   Zfoo)r°   rJ   z"grade.*list must have two elements)r°   rO   rJ   ) r   r‡   Úfname_fmorphr4   r   Ztime_as_indexr[   Útimesr   rJ   r
  r?   rW   r   r]   rt   rQ   rv   Úminr   rŠ   rÑ   rÒ   rp   r9   ri   rÚ   rÛ   Ú	lh_vertnoÚ	rh_vertnor‹   rŒ   )r°   r±   r  Zstc_tor>   Zstc_to1Z	mean_fromZmean_toZvertices_toZstc_to5r½   Zstc_vec_to1r7   r7   r8   Útest_morph_stc_denset  s¦    ÿ    þ
ÿ    þ
     þþ   þ    þÿ  þr  c               
   C   s(  d} d}t tdd�}|jd ddg |jd< |jd dg |jd< |jd	d
… |_t|| |d	dtd� |¡}tt 	|j
jdd�¡t 	|j
jdd�¡ƒ t|jƒt|jƒks®t‚t|jƒt|jƒksÆt‚|j|ksÔt‚|j|jksät‚|j|jksôt‚tjg tjd�|jd< |jd	d… |_t|| |d	dtd� |¡}tt 	|j
jdd�¡t 	|j
jdd�¡ƒ t|jƒt|jƒk�sxt‚t|jƒt|jƒk�s’t‚|j|k�s¢t‚|j|jk�s´t‚|j|jk�sÆt‚tjtdd�� t|| |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 d	S )z#Test morphing stc with sparse=True.r+   r/   rh   r   éd   iô  r:   éÈ   Nr|   T)r°   r±   rO   rN   rJ   rP   )r�   )rO   rN   rJ   zspacing must be set to Noner‚   r  z xhemi=True can only be used with)r°   r±   rO   rN   rl   rJ   )r   r‡   rZ   r  r   rJ   rW   r   rQ   rT   r]   r™   r[   r  r?   r  ri   rÚ   rÛ   r  Zint64rŠ   r‹   rŒ   )r°   r±   r  Zstc_to_sparser7   r7   r8   Útest_morph_stc_sparseÀ  s~        þþÿ    þþÿ    þ     þr   zsl, n_real, n_mri, n_origr:   é%   éŠ   é   é3   éÌ   éX   iD  rÃ   c              	      s`  ddl }|j|j |jpd }t t¡d  dd¡}| |j	ddd… ¡ |j
 ¡  t|j	ƒ}tƒ \‰ }	tttƒƒ}
|
| }tdt|td�}t|ƒ|ksœt‚|jdksªt‚td	d
„ |D ƒƒ}tdd|j
ƒ}t|j
t||ƒ}|d d j||d fksøt‚t|j
|t|j
ƒdd�}t||ƒ}|jj|dfk�s0t‚|j|dd�}|jdk�sNt‚t  |j!¡ "t#¡ ¡ }t$| %t¡ƒ}t &| '¡ ‡ fdd„|D ƒ¡ ¡ }||k�s¢t‚|j|jdd… k�s¼t‚||k�sÊt‚t(dƒD ]J}|�rèd|d d< |j|dd�}t  |j!¡ "t#¡ ¡ }||k�sÒt‚�qÒ|d d dk�s4t‚t)j*t+dd�� |j|dd� W 5 Q R X dS )z1Test generating a source space from volume label.r   Nr:   i2  r#  r+   rå   rË   c                 s   s   | ]}|d  V  qdS rç   r7   ré   r7   r7   r8   rê     s     z+test_volume_labels_morph.<locals>.<genexpr>ÚautoZsolr]   r|   rœ   )ÚlooseTrÍ   )éV   r)  r)  r:   c                    s   g | ]}ˆ | ‘qS r7   r7   )rL   Úname©Úlutr7   r8   rM     s     z,test_volume_labels_morph.<locals>.<listcomp>rm   ZinterpolatorFz.*src\[0\], .* mri_resolutionr‚   ),rÏ   ÚstopÚstartÚstepr=   r   r3   r4   Zpick_channelsZch_namesÚinfoZnormalize_projr[   r   r·   r   rü   r   rJ   r?   r¤   r™   r   r   Úfname_transrp   r   r   r   r]   rÙ   rQ   r  Zdataobjr  r  r   r  rs   rw   ru   rŠ   r‹   ÚRuntimeError)r»   ÚslZn_realZn_mriZn_origrÞ   Zn_user6   Zn_chÚ_r  Zuse_label_namesr¨   Zn_srcZsphererß   r5   rx   r  Zn_onZaseg_imgZ
n_got_realrà   r7   r+  r8   Útest_volume_labels_morphò  s\    



  þÿ
 ÿr5  Úsession)ÚscopeÚparamsc                  C   sà   ddg} t jdddtd�}|t jdtd| tddd	�7 }t  t td
dd¡¡}|t jd
d| tddd�7 }~ tj	t
dd�� t j|dd
td� W 5 Q R X tjtdd��. t j|dd
tdddgdddg|ddd�	}W 5 Q R X |||fS )NzLeft-Cerebellum-CortexzRight-Cerebellum-Cortexr+   Zoct3F)rO   Zadd_distrJ   g      $@T)r,   Úposræ   rJ   Úadd_interpolatorrñ   r/   r-   zfsaverage-ico-5-src.fifg      @)r9  ræ   rJ   r:  rñ   z src_to must be provided .* mixedr‚   )r¨   r°   r±   rJ   znot included in smoothingr:   r   r  )	r¨   r°   r±   rJ   rÇ   rÆ   rÎ   rj   rñ   )r=   Zsetup_source_spacerJ   r   rü   rþ   rH   rI   rŠ   r‹   rŒ   r   rÑ   rÒ   )Z
labels_volr¨   Úsrc_fsr>   r7   r7   r8   Ú_mixed_morph_srcs0  s\     ÿ    ýÿ    þ  þ      ýr<  r1   )FTc              	      sŠ  ddl }| \}‰‰tƒ \‰ }‡ fdd„ˆdd… D ƒ}Š dd„ ˆD ƒ}tdd„ |D ƒƒ}t |d	d
f¡}d|dd…d
f< tj}	|s˜|dd…d
f }|	j}	|	||dd
dƒ}
tt	dd�}t 
‡fdd„ˆdd… D ƒ¡}t t||ƒ|¡ ¡ }t|
 ¡ jˆdd�ƒ}| t¡ ¡ |k�st‚| t	¡}t t|ƒ|¡ ¡ }t|
 ¡ jˆdd�ƒ}| t¡ ¡ |k�sdt‚tjtdd�� | d¡ W 5 Q R X | |
¡}ttdd�}t 
‡fdd„ˆdd… D ƒ¡}t t||ƒ|¡ ¡ }tjtdd�� | ¡ jˆdd� W 5 Q R X t| ¡ jˆdd�ƒ}| t¡ ¡ |k�s.t‚| |
 ¡ ¡}| |
 ¡ ¡}| t 
|j|jg¡|j|j |j|j|j ¡}t!|j|jƒ dS )z!Test mixed source space morphing.r   Nc                    s   g | ]}ˆ |d   ‘qS )rð   r7   ré   r+  r7   r8   rM   Y  s     z+test_mixed_source_morph.<locals>.<listcomp>rm   c                 S   s   g | ]}|d  ‘qS rò   r7   ré   r7   r7   r8   rM   [  s     c                 s   s   | ]}t |ƒV  qd S )N)r[   )rL   Úvr7   r7   r8   rê   \  s     z*test_mixed_source_morph.<locals>.<genexpr>r|   r:   rœ   r+   T)r]   c                    s    g | ]}ˆ d  d |d  ‘qS ©rm   rõ   ró   r7   ©rL   ÚsprÁ   r7   r8   rM   e  s     FrÍ   r¯   r‚   c                    s    g | ]}ˆ d  d |d  ‘qS r>  r7   r?  )r;  r7   r8   rM   t  s     z!stc\.subject does not match src s)"rÏ   r   r™   rQ   Zzerosr=   ZMixedVectorSourceEstimateZ_scalar_classr   rü   r^   rs   r   r   rË   rÙ   r  r  r?   r  rŠ   r‹   rº   rW   rý   rŒ   r©   Ú	__class__r]   rZ   rÚ   rÛ   ri   r   )r<  r1   rÞ   r>   r4  ZidsrZ   Z
n_verticesr]   Úklassrx   Zvol_infoZrrsZn_wantr  Zimg_resr`   Zstc_fs_surfZ
stc_fs_volZstc_fs_2r7   )r,  r¨   r;  r8   Útest_mixed_source_morphO  sZ    

 

 ÿ
  ýrC  c                 C   s^   |   d¡}|dtj |¡  }t d¡}|   d¡d |d d…df< t|ƒ|d d…d d…f< |S )Nr|   r  rB   rÊ   )rV   rQ   rž   rŸ   r   r"   )r_   ZquatrÜ   r7   r7   r8   Ú_rand_affine†  s    

rD  ))rD   rD   rD   )rÃ   r  rD   )r  rD   rÃ   r;   rB   ÚrandÚdipyr�   Ú
from_shapeÚfrom_affineÚto_shapeÚ	to_affinere   Úseedc                 C   s6  t j |¡}|j| Ž }d}t|tƒr<|dks0t‚t|ƒ}d}t|tƒr^|dksRt‚t|ƒ}d}t  |t	¡}|j
dksxt‚t  |t	¡}|j
dks’t‚ddlm}	 ddlm}
 t j |¡}|	|
||ƒ||f|d� ¡ }t j |¡}|d	| ksît‚dd
l}|dk�rdnd}|jj d
||| |¡j||dd�}|�r:|dk�pT|d dk�oTt  ||¡ }|�ox|�ov|d dk�ov|dk }|�r˜t  ||¡�r¦tdƒ‚nt||dd� t j |¡| }t| |||d�}t  ||jdd� ¡j|dd�}|dk�r t||dd� n2dt  ||¡ ¡  }d|  k �r,dk�s2n t‚d
S )zTest resampling equivalences.FrE  T)rB   rB   r   rã   )ÚSpatialImagerú   gš™™™™™©?Nr:   Zlinearr}   )ÚinterpolationZresample_only)r   r   g       @rm   znibabel fixedzdipy<->nibabel)Úerr_msgÚFz
MNE<->dipyr  éS   ) rQ   rR   rS   rV   r²   r„   r?   rD  r  Úfloatrp   rû   rä   Znibabel.spatialimagesrL  rž   rŸ   rÝ   Zdipy.align.imaffineÚalignZimaffineZ	AffineMapZ	transformZallcloser   r5   r!   Zasarrayrw   ZreshapeÚisclosert   )rG  rH  rI  rJ  re   rK  r_   Ú	from_dataZis_randrä   rL  r.  Zgot_nibabelÚendrF  ÚinterpZgot_dipyZnib_differentZtransZgot_mneÚpercr7   r7   r8   Útest_resample_equivŸ  sz    


 þ
   þ  ý
ÿþÿÿ ÿ
rX  )r›   )iÚos.pathÚpathrH   rŠ   ÚnumpyrQ   Znumpy.testingr   r   r   Zscipy.spatial.distancer   Zscipy.sparser   r   r—   r=   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zmne.datasetsr   Z	mne.fixesr   Zmne._freesurferr   r   Zmne.minimum_normr   r   r   Zmne.source_spacer    r!   Zmne.transformsr"   Z	mne.utilsr#   r$   r%   r&   r'   r(   r)   Z	data_pathrI   Z
sample_dirrJ   r3   r1  rÐ   rÕ   r¹   r2   rü   r  r‡   Zfname_t1rÿ   Zfname_brainr   rý   ro   r9   r@   Zrequires_testing_datarg   r{   ÚmarkZparametrizerQ  rˆ   r”   rš   r�   r¿   Zslowtestrá   r  r  r   Úslicer5  ZfixtureZ_pytest_paramr<  rC  rD  Z_shapesZ_affinesrX  r7   r7   r7   r8   Ú<module>   s   L ÿÿÿÿ
ÿ
ÿ
+
<ý

2 5ûÿ J
1ü6
3	



ýù