U
    f»{j�T  ã                   @   s*  d dl Z d dlmZ d dlZd dl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mZmZmZ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+ d dl,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2 d d	l3m4Z4m5Z5 d d
l6m7Z7 d dl8m9Z9 d dl:m;Z;m<Z< d dl=m>Z>m?Z? e+j@dd�Z@e Ae@dd¡ZBe AeBd¡ZCe AeBd¡ZDe AeBd¡ZEe AeBd¡ZFe AeBd¡ZGe AeBd¡ZHe AeBd¡ZIe AeBd¡ZJe AeBd¡ZKe AeBd¡ZLe AeBd¡ZMe Ae@dddd¡ZNe Ae@dddd ¡ZOe Ae@d!d"¡ZPe Ae@d!d#¡ZQe Ae@d!d$¡ZRe Ae@d%d&¡ZSe Ae@d¡ZTd'd(„ ZUd)d*„ ZVe+jWd+d,„ ƒZXe+jWd-d.„ ƒZYejZj[e+jWe/ƒ e-d/d0„ ƒƒƒƒZ\e+jWd1d2„ ƒZ]e+jWd3d4„ ƒZ^ejZj[e+jWd5d6„ ƒƒZ_d7d8„ Z`e+jWd9d:„ ƒZae+jWd;d<„ ƒZbd=d>„ Zcd?d@„ Zde+jWdAdB„ ƒZee+jWejZ fdCeEeFfeGeHfg¡dDdE„ ƒƒZgdS )Fé    N)Úassert_allcloseÚassert_array_equalÚassert_array_less)Úread_dipoleÚread_forward_solutionÚconvert_forward_solutionÚread_evokedsÚread_covÚSourceEstimateÚwrite_evokedsÚ
fit_dipoleÚtransform_surface_toÚmake_sphere_modelÚ
pick_typesÚ	pick_infoÚEvokedArrayÚread_source_spacesÚmake_ad_hoc_covÚmake_forward_solutionÚDipoleÚDipoleFixedÚEpochsÚmake_fixed_length_eventsÚEvokedÚhead_to_mni)Úget_phantom_dipolesÚ_BDIP_ERROR_KEYS)Úsimulate_evoked)Útesting)Úrequires_mneÚrun_subprocessÚrequires_nibabelÚ_record_warnings)Úmake_eeg_average_ref_proj)Úread_raw_fifÚread_raw_ctf)ÚFIFF)Ú_compute_nearest)Ú_bem_find_surfaceÚread_bem_solution)Úapply_transÚ
_get_transF)ÚdownloadZMEGÚsamplezsample_audvis-ave_xfit.dipzsample_audvis_trunc_raw.fifzsample_audvis_trunc_set1.dipzsample_audvis_trunc_set1.bdipzsample_audvis_trunc_xfit.dipzsample_audvis_trunc_xfit.bdipzsample_audvis_trunc-ave.fifzsample_audvis-ave.fifzsample_audvis_trunc-cov.fifzsample_audvis_trunc-trans.fifz)sample_audvis_trunc-meg-eeg-oct-6-fwd.fifZsubjectsÚbemz!sample-1280-1280-1280-bem-sol.fifzsample-oct-2-src.fifÚdipzfixed_auto.fifzfixed_auto.dipzsequential.dipZCTFztestdata_ctf_short.dsc                 C   st   t | j|jddd� t | j|jdd� t | j|jdd� t | j|jdd� t | j|jddd	d
� | j|jkspt‚dS )z'Compare dipole results for equivalence.çü©ñÒMbP?Útimes©ÚatolÚerr_msgÚpos©r4   Ú	amplitudeÚgofç-Cëâ6?Úori)Úrtolr3   r4   N)r   r1   r5   r7   r8   r:   ÚnameÚAssertionError)ÚorigÚnew© r@   úT/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/tests/test_dipole.pyÚ_compare_dipoles;   s    rB   c                 C   s`   t | ƒ|kst‚| jj|dfks$t‚| jj|dfks8t‚| jj|fksJt‚| jj|fks\t‚dS )zCheck dipole sizes.é   N)Úlenr=   r5   Úshaper:   r8   r7   )r/   Z	n_dipolesr@   r@   rA   Ú_check_dipoleE   s
    rF   c                 C   sH   t tƒ}dt|ƒkst‚t t| ƒd¡}| |¡ t |ƒ}t||ƒ dS )zTest IO for .dip files.zDipole ztemp.dipN)	r   Ú	fname_dipÚreprr=   ÚopÚjoinÚstrÚsaverB   )Útmp_pathÚdipoleZ	out_fnameZ
dipole_newr@   r@   rA   Útest_io_dipolesN   s    
rO   c                  C   sh   t tƒjdd�} t| dƒ}t| |ddddd� ¡ }t|jƒ}tdƒ}t	|||t
t|jƒd�d	d
d� dS )z"Test dipole fitting with CTF data.T)Ú
projectioné   r   N©Zbaseline)ç        rS   rS   ©Úmegr0   Zaccurate)ÚrankÚtolZaccuracy)r%   Ú	fname_ctfZset_eeg_referencer   r   Zaverager   Úinfor   r   ÚdictrD   Údata)Zraw_ctfÚeventsÚevokedÚcovÚspherer@   r@   rA   Útest_dipole_fitting_ctfY   s    

 ÿr`   c           !         sÐ  d}t | ƒ}tj d¡‰t |d¡}t |d¡}tttƒdddd�}t	t
ƒd ‰ ttƒ}d‰‡‡fd	d
„|d D ƒ}tdd„ |D ƒƒ}t|t |¡ |ddƒ}	t||	ˆ j|ˆ jˆd�‰ t t tˆ jddd�ddd… tˆ jddd�ddd… g¡¡}
ˆ  ‡ fdd
„|
D ƒ¡ ˆ  tˆ jƒ¡ t|ˆ ƒ tdd|dddtd|dtddddgƒ t|ƒ}tdd�}tjtd d!�� t ˆ ||td"d#�\}}W 5 Q R X t!|t"ƒ�s t#‚|j$d$t%t&d%�}t'|j(d$|d& t&d%�}t)||ddd'� d(d)d(d*d(d)d)d)d+d*g
}|j*t%d,d-t&d.�}||k�st#‚t +tjˆ j,d dd/�¡}t +tj|j,d dd/�¡}||d0 k -¡ �slt#d1||  .¡ d0f ƒ‚t/|d d d2|d& ƒ t/|d d3 d2|d& ƒ |d d d4 t0j1k�s¸t#‚tjd5d
„ t2|d |ƒD ƒdd/�}tjd6d
„ t2|d |ƒD ƒdd/�}| 3|j4d |j4d7 ¡}||k�s"t#‚|dd7… |dd7…  }}g g g g g f\}}}}}||fD ]¸}|j(}|| }|t 5| 6¡ | 6¡ ¡d8 g7 }|t +t 7tj|| d3d/�¡¡g7 }|d9tj8 t 7t 9tj||j: d3d/�¡¡ g7 }|t +t 7||j; d ¡¡g7 }|t 7|j<¡g7 }�q\d:} |d |  |d3 k�s<t#d;| ƒ‚|d |  |d3 k�s^t#d<| ƒ‚|d |  |d3 d= k�s„t#d>| ƒ‚|d |  |d3 k�s¦t#d?| ƒ‚|d |  |d3 d k�sÌt#d@| ƒ‚dS )AzTest dipole fitting.gH¯¼šò×z>r   ztest.dipztest-ave.fifFT)Zsurf_oriÚforce_fixedÚuse_cpsé   c                    s(   g | ] }t  ˆ |d  ¡dˆ … ¡‘qS )ÚvertnoN)ÚnpÚsortZpermutation)Ú.0Ús)Ú
n_per_hemiÚrngr@   rA   Ú
<listcomp>z   s   ÿz'test_dipole_fitting.<locals>.<listcomp>Úsrcc                 s   s   | ]}t |ƒV  qd S ©N©rD   ©rg   Úvr@   r@   rA   Ú	<genexpr>|   s     z&test_dipole_fitting.<locals>.<genexpr>r0   )ÚnaveZrandom_state©rU   ÚeegNé   c                    s   g | ]}ˆ j | ‘qS r@   )Úch_names)rg   Úp)r]   r@   rA   rk   „   s     Zmne_dipole_fitz--measz--megz--eegz--noisez--dipz--mriz--regÚ0z--tminçš™™™™™¹?©Zhead_radiusrP   ©ÚmatchrY   )rV   r-   )Úsubjects_dirZ
mri_head_t)r;   r3   zLeft-Cerebral-CortexÚUnknownzRight-Cerebral-CortexzRight-Cerebral-White-MatterZ	fsaverageÚaseg)Úsubjectr   r}   )Zaxisgffffffî?z%s (factor: %s)ÚheadrQ   Úcoord_framec                 S   s   g | ]\}}|d  | ‘qS )Úrrr@   ©rg   rh   rp   r@   r@   rA   rk   ±   s     c                 S   s   g | ]\}}|d  | ‘qS )Únnr@   r„   r@   r@   rA   rk   ³   s     éÿÿÿÿ)r   rQ   é´   gffffffæ?z	dists: %sz	corrs: %sgš™™™™™é?zgc-dists (ori): %szamplitude errors: %szgof: %s)=rK   re   ÚrandomZRandomStaterI   rJ   r   r   Ú	fname_fwdr   Ú	fname_evor	   Ú	fname_covÚsumr
   Úeyer   rY   rr   rf   Zconcatenater   Úpick_channelsZadd_projr#   r   r    r   r   ÚpytestÚwarnsÚRuntimeWarningr   Ú
isinstancer   r=   Zto_mniÚfname_transr}   r   r5   r   Zto_volume_labelsÚsqrtr[   ÚallÚminr   r&   ZFIFFV_COORD_HEADÚzipÚcropr1   ZcorrcoefÚravelÚmeanÚpiZarccosr:   r7   r8   )!rM   ÚampÚtempdirZfname_dtempZ	fname_simÚfwdr^   ÚverticesÚnvÚstcÚpicksZdip_cr_   r/   ÚresidualZdip_mni_posZhead_to_mni_dip_posZtarget_labelsÚlabelsZdata_rmsZresi_rmsZsrc_rrZsrc_nnÚoutZcorrsÚdistsZgc_distsZamp_errsZgofsÚdr?   ZdiffsÚfactorr@   )r]   ri   rj   rA   Útest_dipole_fittingi   sÞ     þÿÿþ
            ý

ÿÿÿ    ý ÿÿÿÿ$ÿ ""ÿÿr©   c              
   C   sv  d}t dd�}ttdd�d }|jdd� t t ||j ¡¡}| ¡  	||¡}t
|jƒd	ksbt‚ttƒ}t|||ƒ\}}t|tƒsˆt‚t|tƒs–t‚t
|jƒd	ks¨t‚|jd |jd |jd   }	}
}|jd }t||||	d
�\}}t|tƒsöt‚t|tƒ�st‚t|j|jƒ tt |	tj t
|jƒd	f¡|jƒ t|
|j| ƒ t |j|
¡ ¡ dk �sdt‚t||j| ƒ t||j| ƒ t|j|jdd…|gf ƒ t||||	|
d�\}}t|tƒ�sÆt‚t|j|jƒ t|jd d d dd… |	ƒ t|jd d d dd… |
ƒ t|jd	|f |ƒ t|j|jdd…|gf ƒ t|| ƒ |jd g|jd< t||||	|
d�\}}| ¡  	dd¡}d|jd< t  !t"t|||¡ t j!t"t|||d	ddgd� t j!t"t|||dddgdddgd� t j!t"t|||dddgd
� | ¡ }d|jdd…< tj#|jddd� $¡ �r0t‚t% &d¡ | '¡  t% &d¡ t (|j¡}| )d¡j}t||d	 ƒ dS )z*Test dipole fitting with a fixed position.gã¥›Ä °²?ry   rz   ©Nr   rR   r   TrT   rQ   )r5   gÍÌÌÌÌÌì?N)r5   r:   ÚchsÚlocrC   é   Úbads)r   r   )r:   ru   rS   g#B’¡œÇ;©r3   r•   ç      ð?)*r   r   rŠ   r   re   ZargminÚabsr1   Úcopyr˜   rD   r=   r	   r‹   r   r’   r   r   r5   r:   r8   r7   r   ZtileZnewaxisÚdotrš   r[   r   rY   Ú_check_roundtrip_fixedrv   r�   ÚraisesÚ
ValueErrorÚiscloseÚanyÚpltÚcloseZplotÚarrayZ
shift_time)rM   Ztpeakr_   r]   Zt_idxZevoked_cropr^   Zdip_seqZresidr5   r:   r8   rœ   Zdip_freeZ
resid_freeZ	dip_fixedZresid_fixedZ
evoked_nanZdip_fixed_2Z
orig_timesZshift_timesr@   r@   rA   Útest_dipole_fitting_fixedÓ   sj    
"
ÿ  

ÿ

r¼   c                  C   sv   t tƒ} | d }| dd… }t|dƒ t|dƒ t||ƒ | jdk}t |¡d }| | }t|dƒ t|| | ƒ dS )z(Test len and indexing of Dipole objects.r   NrQ   é   é   )r   rG   rF   rB   r8   re   Úwhere)rN   Zd0Zd1ÚmaskÚidxZd_maskr@   r@   rA   Útest_len_index_dipoles  s    




rÂ   c               	   C   s"  d} t tdd�}t|jdddd�}t|j|ƒ}ttƒ}t |d j	d ¡|d< t 
|j	d ¡}d	|d
d…< |dd…df }t||dd�}d}ttƒ}t|||t|dd�\}	}
t|
tƒsºt‚t|	tt| tƒ}|d |d d   k rî|d k sôn t‚tjtdd�� t||ttdƒ W 5 Q R X dS )z$Test dipole min_dist to inner_skull.r-   T)ZpreloadFr®   )rU   rt   Úexcluder[   r   rQ   é   é"   N)Ztming      @r9   )Úmin_distrW   ry   g     @�@r°   zmin_dist should be positiver{   g      ð¿)r$   Ú	fname_rawr   rY   r   r	   r‹   re   r�   rE   Zzerosr   r)   Ú	fname_bemr   r“   r’   r   r=   Ú_compute_depthr}   r�   rµ   r¶   )r€   Úrawr¢   rY   r^   Zsimulated_scalp_mapr]   rÆ   r.   r/   r£   Údistr@   r@   rA   Útest_min_distance_fit_dipole!  s*    
 ÿ
*rÌ   c           
      C   sV   t |ƒd }t|ƒ}t|dƒ}|d }t|d |ƒ}t|| jdd�d d }	t |	¡S )zCompute dipole depth.r   Zinner_skullrƒ   ÚtransT)Zreturn_distsrQ   )r+   r)   r(   r*   r'   r5   re   r™   )
r/   rÈ   r“   r€   r}   rÍ   r.   ZsurfZpointsÚdepthr@   r@   rA   rÉ   H  s    
rÉ   c               	   C   sÜ  t tƒd  dd¡} | jddd� |  dd„ | jddd	… D ƒ¡ td
dƒD �]ˆ\}}td|| jdd�}t	t
ƒ}t| jd||ƒ}t|ddd�}|d d |d d g}tdd„ |D ƒƒ}d}t |d ¡d|… }	d|	d< |	|9 }	t|	|dddƒ}
| j ¡  t||
| jdtjd�}t| jƒ}t|||dd�d }g }t|ƒD ]~}|t|d ƒk �r\d}|}nd}|t|d ƒ }|| d | }|| d | }t t ||j|  d ¡¡}| |¡ �q<tt |ddg¡d|gƒ qLdS ) z'Test dipole fitting to sub-mm accuracy.r   rS   TFrs   c                 S   s   g | ]}|‘qS r@   r@   )rg   Úcr@   r@   rA   rk   X  s     z!test_accuracy.<locals>.<listcomp>Nr¾   )g
×£p=
·?N)gü©ñÒMb`?gü©ñÒMbp?Úauto)g+‡ÙÎ÷ï?gV-²�ïï?g�•C‹lçï?g×£p=
×ï?)Zrelative_radii)ra   rb   rd   rQ   c                 s   s   | ]}t |ƒV  qd S rm   rn   ro   r@   r@   rA   rq   a  s     z test_accuracy.<locals>.<genexpr>ç:Œ0âŽyE>r°   )r†   r†   r0   r-   )r^   rr   )rÆ   rƒ   ru   é2   éZ   çü©ñÒMb@?)r   rŠ   r˜   r   rŽ   rv   r—   r   rY   r   Ú	fname_srcr   r   rŒ   re   r�   r
   Znormalize_projr   Úinfr   r   ÚrangerD   r”   r5   Úappendr   Z
percentile)r]   ZradZperc_90r.   rl   rž   rŸ   Z
n_verticesrœ   r[   r¡   Úsimr^   r/   ZdsÚviÚhird   rƒ   r§   r@   r@   rA   Útest_accuracyS  sB     
ÿ

rÜ   c              	   C   s¸   t tƒ}dt|ƒkst‚t|| ƒ tjtdd�� t tƒ}W 5 Q R X t	|j
d d d dd… |jd ƒ t	|jd d	ƒ tjtdd�� t tƒ}W 5 Q R X t	|jd
dddddgƒ dS )z1Test reading a fixed-position dipole (from Xfit).zDipoleFixed zextra fieldsr{   r«   r   r¬   NrC   g[ñí›üI>gÍÌÌÌÌL;@g333333G@gš™™™™ÙE@g     €D@gfffff¦B@g     @@@)r   Úfname_xfit_diprH   r=   r´   r�   r�   r‘   Úfname_xfit_dip_txtr   rY   r5   r7   Úfname_xfit_seq_txtr8   )rM   r/   Zdip_txtZdip_txt_seqr@   r@   rA   Útest_dipole_fixed  s    
&rà   c                 C   sÊ   t |ƒ}|  t |d¡¡ tt |d¡ƒ}t|j|jƒ t|j| jdd� |jd | jd ksbt	‚|j
| j
ksrt	‚t|jd | jd ƒD ]<\}}|d |d ks¤t	‚dD ]}t|| || |d� q¨qˆd	S )
z%Check roundtrip IO for fixed dipoles.ztest-dip.fif.gzrÑ   r¯   Zxplotter_layoutr«   Zch_name)
r¬   ÚkindZunit_mulr×   r‚   ÚunitÚcalZ	coil_typeZscannoZlognor6   N)rK   rL   rI   rJ   r   r   r[   r1   rY   r=   rv   r—   )r/   rM   r�   Údip_readZch_1Zch_2Úkeyr@   r@   rA   r´   �  s    r´   c                  C   sR   t  ttd¡ t  ttd¡ dD ],} t| ƒ\}}|jdks>t‚|jdks t‚q dS )z&Test getting phantom dipole locations.r   Zfoo)Z
vectorviewZotaniemi)é    rC   N)r�   rµ   r¶   r   rE   r=   )rá   r5   r:   r@   r@   rA   Útest_get_phantom_dipoles   s    rç   c           
   	   C   s2  t tddd�}| dd¡jdd� t|jƒ}tddƒ}t|||ƒd }t 	t
| ƒd	¡}| |¡ t|ƒ}tjtd
d�� ttƒ}W 5 Q R X ||fD ]š}t|j|jdd� t|j|jdd� t|j|jƒ t|j|jdd� t|j ¡ ƒt|j ¡ ƒksút‚t|j ¡ ƒD ]"}	t|j|	 |j|	 d|	d� �qq’dS )zTest confidence limits.zLeft Auditoryrª   rR   g{®Gáz´?TrT   )rS   rS   g{®Gáz¤?r   ztemp-dip.txtz'noise/ft/cm', 'prob'r{   rÔ   r¯   g      à?g{®Gáz”?)r;   g333333Ã?©r;   r4   N)r   Úfname_evo_fullr˜   r   r   rY   r   r   rI   rJ   rK   rL   r   r�   r�   r‘   Úfname_dip_xfit_80r   r5   r8   r   ÚnfreeÚkhi2ÚsetÚconfÚkeysr=   Úsorted)
rM   r]   r^   r_   Zdip_pyZ
fname_testrä   Zdip_xfitZ	dip_checkrå   r@   r@   rA   Útest_confidenceª  s*    


  ÿrñ   zfname_dip_, fname_bdip_c              	   C   sÈ  t ƒ � t| ƒ}W 5 Q R X t |¡j}t|ƒ}|d }| |¡ t|ƒ}t t|ƒ¡j}||ksdt‚t|ƒt|ƒ  krŽt|ƒ  krŽdks”n t‚| t	k}	d|fd|ffD �]\}
}dD ]X\}}t
||ƒ}t
||ƒ}|dkrº|	rº|dk	�rt|||d|
|f d	� qº|dksºt‚qº|	�r�td
 }t|j ¡ ƒt|j ¡ ƒ  k�rRt|ƒk�sXn t‚|D ]2}|j| }|j| }t||dd|
|f d� �q\|jdk�s t‚|jdk�s°t‚|d }t|dƒ q¬dS )zTest bdip I/O.z	test.bdipé   r>   Úread))r5   ç-Cëâ6
?)r:   g{®Gázt?)r8   gš™™™™™©?)r1   rô   )rì   g{®Gáz„?rì   Nz%s: %sr2   )Zvolg¸…ëQ¸¾?rè   r   rQ   )r"   r   ÚosÚstatÚst_sizerL   rK   r=   rD   Úfname_dip_xfitÚgetattrr   r   rí   rî   rï   r<   rë   rF   )Z
fname_dip_Zfname_bdip_rM   r/   Z	orig_sizeZbdipÚfnameZ	bdip_readZ
write_sizeZdip_has_confrá   Z	this_bdiprå   r3   r§   ÚbZ	conf_keysZ
this_bdip0r@   r@   rA   Ú	test_bdipÈ  sL    
0



ÿÿ
þ


ÿ
rü   )hrõ   Úos.pathÚpathrI   Únumpyre   Znumpy.testingr   r   r   Zmatplotlib.pyplotZpyplotr¹   r�   Zmner   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z
mne.dipoler   r   Zmne.simulationr   Zmne.datasetsr   Z	mne.utilsr   r    r!   r"   Zmne.projr#   Zmne.ior$   r%   Zmne.io.constantsr&   Zmne.surfacer'   Zmne.bemr(   r)   Zmne.transformsr*   r+   Z	data_pathrJ   Zmeg_pathrê   rÇ   rG   Z
fname_bdiprø   Zfname_bdip_xfitrŠ   ré   r‹   r“   r‰   rÈ   rÕ   rÝ   rÞ   rß   rX   r}   rB   rF   Zrequires_testing_datarO   r`   ÚmarkZslowtestr©   r¼   rÂ   rÌ   rÉ   rÜ   rà   r´   rç   rñ   Zparametrizerü   r@   r@   r@   rA   Ú<module>   s’   `ÿÿ
	


f
=
%
+


þ