U
    f»{j•S  ã                	   @   sÒ  d dl mZ d dlm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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 d dlmZ d dlmZ d d	lm Z  d d
l!m"Z" d dl#m$Z$m%Z% d dl&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ d dl0m1Z1m2Z2 d dl3m4Z4 e 5e 6e7¡ddddd¡Z8e 5e"j9dd�d¡Z:e 5e:ddd¡Z;e 5e:ddd¡Z<e 5e:ddd¡Z=e 5e:ddd¡Z>e 5e:ddd¡Z?dd„ Z@d d!„ ZAejBjCe%d"ƒ d#d$�ZDe"jEejB Fd%d&ejGd'eDd(�g¡d)d*„ ƒƒZHd+d,„ ZIe"jEejB Fd-ejGeJƒ e;ejBjKd(�eJd.gd/�e<gg¡d0d1„ ƒƒZLe"jEd2d3„ ƒZMejBjKe"jEejB Fd4d5e>gd6e=gg¡d7d8„ ƒƒƒZNd9d:„ ZOejBjKe"jEd;d<„ ƒƒZPejBjKd=d>„ ƒZQejB Fd?dd@g¡ejB FdAdBdCg¡e"jEdDdE„ ƒƒƒZRdS )Fé    )Údeepcopy)ÚmakedirsN)Úcopy)Úassert_equalÚassert_allclose)Úmake_bem_modelÚread_bem_surfacesÚwrite_bem_surfacesÚmake_bem_solutionÚread_bem_solutionÚwrite_bem_solutionÚmake_sphere_modelÚ	TransformÚInfoÚwrite_surfaceÚwrite_head_bem)Úfit_sphere_to_headshape)ÚFIFF)Útranslation)Útesting)Úcatch_loggingÚcheck_version)	Ú_ico_downsampleÚ_get_ico_mapÚ_order_surfacesÚ_assert_complete_surfaceÚ_assert_insideÚ_check_surface_sizeÚ_bem_find_surfaceÚmake_scalp_surfacesÚdistance_to_bem)Úread_surfaceÚ_get_ico_surface)Ú	read_infoz..ÚioZtestsÚdataztest_raw.fifF)ÚdownloadZsubjectsÚsampleÚbemzsample-320-320-320-bem.fifzsample-320-bem.fifzsample-320-320-320-bem-sol.fifzsample-320-bem-sol.fifzsample-head-dense.fifc              	   C   sœ   ddddddddg}d	d
ddg}t | |ƒD ]l\}}tt|ƒt| ¡ ƒt|ƒ ƒ tt|ƒt| ¡ ƒt|ƒ ƒ |D ]"}t|| || ddd| d� qrq*dS )zCompare BEM surfaces.ÚidÚnnÚrrÚcoord_frameÚtrisÚsigmaÚntriÚnpZtri_centZtri_nnZtri_areaZneighbor_triçü©ñÒMbP?ç�íµ ÷Æ°>zMismatch: "%s"©ÚrtolÚatolÚerr_msgN)Úzipr   ÚsetÚkeysr   )Zsurfs_1Zsurfs_2ÚnamesZignoresÚs0Ús1Úname© r>   úQ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/tests/test_bem.pyÚ_compare_bem_surfaces/   s    ÿr@   c                 C   sˆ   t | d |d ƒ dddddddd	g}tt|  ¡ ƒt| ¡ ƒƒ tt|dg ƒt| ¡ ƒƒ |D ]"}t| | || d
dd| d� q`dS )zCompare BEM solutions.ÚsurfsZ
bem_methodZ
field_multÚgammaZ	is_sphereZnsolr.   Zsource_multÚsolutionr1   çñhãˆµøä>zMismatch: %sr3   N)r@   r   r8   r9   r   )Zsol_aZsol_br:   Úkeyr>   r>   r?   Ú_compare_bem_solutions;   s       ÿÿrF   Úh5pyz
Needs h5py)ÚreasonÚextÚfifÚh5)Zmarksc           	   	   C   sš  t  t| ƒd|› �¡}tjtdd�� ttƒ W 5 Q R X tjtdd�� ttdd� W 5 Q R X ttdd�}ttd	d�}t	||d
 ƒ tjt
dd�� t	||d
 ƒ W 5 Q R X t	||d
 dd� |dkræd
dl}| |d¡� W 5 Q R X t|d	d�}t||ƒ tjtdd�� ttƒ W 5 Q R X t  t| ƒd|› �¡}ttƒ}dt|ƒk�sNt‚t||ƒ t|ƒ}t||ƒ ttƒ}tjtdd�� t|dƒ W 5 Q R X dS )z7Test reading and writing of bem surfaces and solutions.z	temp-bem.zBEM data not found©Úmatchzsurface with id 10é
   )Zs_idT)Zpatch_statsFr   Úexists©Ú	overwriterK   NÚrzNo BEM solution foundz	temp-sol.ZBEMz BEM does not have.*triangulationé   )ÚopÚjoinÚstrÚpytestÚraisesÚ
ValueErrorr   Ú	fname_rawÚfname_bem_3r	   ÚIOErrorrG   ÚFiler@   ÚRuntimeErrorr   Úfname_bem_sol_3ÚreprÚAssertionErrorr   rF   Úfname_bem_sol_1r   )	Útmp_pathrI   Ztemp_bemÚsurfrG   Z	surf_readZtemp_solZsolZsol_readr>   r>   r?   Útest_io_bemL   s8    



re   c               	   C   sh  t tƒ} t ttdd| ¡ t ttddd¡ tjttdd| ddd� tjtdd�� tdd| dd	� W 5 Q R X tƒ �}tdd| d
d�}W 5 Q R X | ¡ }d|ks¤t‚| 	d¡D ],}d|kr®t
| 	¡ d ƒ}|dk sÖt‚ qÜq®dt|ƒksìt‚dt|ƒksüt‚dt|ƒk�st‚tdd| ƒ}dt|ƒk�s,t‚dt|ƒk�s>t‚tjtdd�� tddd� W 5 Q R X dS )zTest making a sphere model.ÚfooÚautoNr>   )Úrelative_radiiÚsigmasz"relative_radii.*must match.*sigmasrL   )é   )rh   T©Úverbosez RV = Ú
éþÿÿÿç{®Gáz„?z3 layerszSphere z mmz	no layerszat least 2 sigmas.*head_radius)g…ëQ¸Õ?)ç      ð?)ri   rh   )r#   rZ   rW   rX   rY   r   r   Úgetvaluera   ÚsplitÚfloatr`   )ÚinfoÚlogr(   ÚlineÚvalr>   r>   r?   Útest_make_sphere_modelt   s4     ÿrx   zkwargs, fnameç333333Ó?)Úconductivityc              	   C   sì   | d }t ƒ �}tddtddœ|—Ž}W 5 Q R X | ¡ }t| dd¡ƒdkrZd	|ksnt‚nt d
|¡dk	snt‚t d|¡dk	s‚t‚t	|ƒ}t
||ƒ t||ƒ t	|ƒ}t
||ƒ t
||ƒ tjtdd�� tddddgtd� W 5 Q R X dS )z-Test BEM model creation from Python with I/O.ztemp-bem.fifr'   é   T)ÚicoÚsubjects_dirrl   rz   )r   r   r   rj   Zdistancez!urfaces is approximately *3\.4 mmNz+inner skull CM is *0\.65 *-9\.62 *43\.85 mmzconductivity must berL   é   ry   çú~j¼t“x?©r}   )r'   )r   r   r}   rq   ÚlenÚgetra   ÚreÚsearchr   r@   r	   rW   rX   rY   )rc   ÚkwargsÚfnameÚ
fname_tempru   ÚmodelZmodel_cZ
model_readr>   r>   r?   Útest_make_bem_model’   s0    ÿÿÿÿ



r‰   c              	   C   s  t | d d ƒ dD ].}|d7 }tt tdd|¡| d d | ƒ q| d d d }t|ƒ\}}|dd… }t|||dd… d	d
� tjt	dd�� t
dd| d� W 5 Q R X tj|tj|dd	d�gdd�}t|||d	d
� tjtdd�� t
dd| d� W 5 Q R X dS )z"Test BEM model topological checks.rf   r(   )Zinner_skullZouter_skullZ
outer_skinz.surfr'   zouter_skull.surfNéÿÿÿÿTrP   z Surface outer skull is not complrL   r€   r   )ÚaxisZkeepdims)r‹   zSurface outer skull.*triangles)r   r   rT   rU   r}   r!   r   rW   rX   r^   r   r0   ZconcatenateZmeanrY   )rc   r†   Zouter_fnamer+   r-   Zrr_badr>   r>   r?   Útest_bem_model_topology¯   s     ÿrŒ   zcond, fname)ry   )ry   r   ry   c                 C   sØ  t tƒd }t tt|d¡ t|d dd… |d d |d d�}t tt|d¡ t|d  ¡ |d |d d�}dddg|d d< t tt|d¡ d|d	< t tt|¡ t|d |d |d  ¡ d�}d
|d d< t tt	||¡ t t
ƒ}t tt|d |d ¡ d|d d	< t tt|¡ |d d  d  < t tt|d ¡ t t| ƒd¡}dD ]8}|dk�rvtd|dtd�}nt|ƒdk�rˆtnt
}�qVt|dd�}	t|ƒ}
t|	|
ƒ t||	ƒ t|ƒ}t|	|
ƒ t||
ƒ dS )z0Test making a BEM solution from Python with I/O.r   rN   r-   rj   Nr/   r+   )r-   r/   r+   r)   ç        éd   g     @�@ztemp-bem-sol.fif)ÚpythonÚcr�   r'   r{   )rz   r|   r}   Trk   )r   Úfname_bem_1rW   rX   r^   r   Údictr   r   r   r[   r   r   r   rT   rU   rV   r   r}   r�   r
   r   rF   r   )rc   Zcondr†   rd   Zs_badrA   r‡   Z
model_typerˆ   rC   Z
solution_cZsolution_readr>   r>   r?   Útest_bem_solutionÅ   sD    	&ÿ
ÿ


r“   c                  C   s”  d} d}t  dddg¡}t  dddg¡}|| }tjtjtjt  dddg¡d	œtjtjtjt  dd
dg¡d	œtjtjtjt  d
ddg¡d	œtjtjdt  ddd
g¡dœtjtj	dt  dddg¡dœtjtj	dt  dddg¡dœtjtj	dt  dddg¡dœtjtj	dt  ddd
g¡dœtjtj	dt  dddg¡dœg	}|D ]&}|d  | 9  < |d  |7  < �q:t
ddt|Ž ƒ}t||d�}tjtt|tjfd� tjtt|ddd� tj|d  d d!< tjtt|dd"� tj|d  d d!< tjtjf}	tjtd#d$�� t||	dd�\}
}}W 5 Q R X td%d&d'�}t|
| f|Ž t||f|Ž t||f|Ž d(tjd)f}	td%d%d'�}tjtd#d$�� t||	dd�\}
}}W 5 Q R X t|
| f|Ž t||f|Ž t||f|Ž d)}	tjtd#d$�� t||	dd�\}
}}W 5 Q R X td%d*d'�}t|
| f|Ž t||f|Ž t||f|Ž d+}	t|ƒ}|d  D ]:}|d  |8  < |d  ||  9  < |d  |7  < �q:tjtd,d$�� t||	d-d�\}
}}W 5 Q R X t||d. d%d/� t|
|d. d%d/� ~d+}	t|ƒ}t  dd0dg¡}|d  D ]&}|d  |8  < |d  |7  < �qîtjtd1d$�� t||	dd�\}
}}W 5 Q R X t||d2d/� t|
| d2d/� tjtd#d$�� t|dd"�\}
}}W 5 Q R X td%d%d'�}t|
| f|Ž t||f|Ž t||f|Ž tjtd#d$�� t|dd"�\}}}W 5 Q R X t|
|d3d/� t||d3d/� t||d3d/� t|d4d5… |d�}tjtd#d$�� t|dd"�\}
}}W 5 Q R X t|d4d6… |d�}tjtt|dd"� tjttddd"� d4S )7z-Test fitting a sphere to digitization points.g
×£p=
·?g¸…ëQ¸¾?gü©ñÒMb@?g{®Gáz„¿g{®Gáz¤?r�   g{®Gázt¿g      ð¿)r,   ÚidentÚkindrR   rp   r   )r,   r•   r”   rR   g
×£p=
ç?g®Gázæ?rj   gš™™™™™á¿gq=
×£på?g      à?r{   gš™™™™™á?rS   r~   g
×£p=
ç¿rR   ZmegÚhead)ÚdigÚ
dev_head_t)Ú	dig_kindsrf   Úm)r™   Úunitsr—   r,   )r›   zOnly .* head digitizationrL   r1   rD   ©r4   r5   ÚcardinalZeegro   )r�   ÚextrazEstimated head sizeÚmmiè  )r5   g¸…ëQ¸ž¿zfrom head frame originr2   gH¯¼šò×z>Né   é   )r0   Úarrayr   ZFIFFV_COORD_HEADZFIFFV_POINT_LPAZFIFFV_POINT_CARDINALZFIFFV_POINT_NASIONZFIFFV_POINT_RPAZFIFFV_POINT_EXTRAZFIFFV_POINT_EEGr   r   r   rW   rX   rY   r   ZFIFFV_POINT_HPIZFIFFV_COORD_DEVICEr^   ÚwarnsÚRuntimeWarningr’   r   r   Ú	TypeError)ÚradZbig_radÚcenterZ	dev_transZ
dev_centerr—   Údr˜   rt   r™   rR   ZohZodr…   Zinfo_bigZ
info_shiftZshift_centerÚr2Zoh2Zod2r>   r>   r?   Útest_fit_sphere_to_headshapeõ   s   ýýýýýýýýýÓ2
ÿ
 ÿÿÿÿÿ  ÿrª   c              	   C   sX  t tƒd }t t| ƒd¡}t dddg¡|d d< t ddd	g¡|d
 d< tjt	dd�� t
||d |d
 ƒ W 5 Q R X tjtdd�� t
||d |d
 dd� W 5 Q R X tjt	dd�� t |ƒ W 5 Q R X tjtdd�� t |dd�d }W 5 Q R X |d |d   k�rtjk�s n t‚t |d |d ¡�s:t‚t |d
 |d
 ¡�sTt‚dS )z4Test reading and writing of defective head surfaces.r   ztemp-head-defect.fifgŽAåg<tŽ¿g¯pyIï]§¿gNPš84À¿r+   iŸU  ižU  i“U  r-   ztopological defects:rL   Úwarn©Z
on_defectsr)   N)r   Úfname_dense_headrT   rU   rV   r0   r¢   rW   rX   rY   r   r£   r¤   r   ZFIFFV_BEM_SURF_ID_HEADra   Zallclose)rc   r–   Zfname_defectZhead_defectr>   r>   r?   Útest_io_head_bem�  s"    ÿ(r®   c           	   	   C   sä  t  d¡ | }d}|| d }t|ƒ tdƒ}|d  d9  < t|d |d |d ƒ d	d
„ }| tjd|¡ | tjdtdd�¡ t j	t
dd�� t||ddd� W 5 Q R X | tjdtdd�¡ t j	tdd�� t||dddd� W 5 Q R X || d }||› d� }| ¡ �rt‚| tjdtdd�¡ t jtdd�� t||ddd� W 5 Q R X t|dd�\}t|d ƒdk�s|t‚| tjdtdd�¡ t jtdd�� t||ddd� W 5 Q R X t|dd�\}t|d ƒdk�sàt‚dS )z-Test topology checks for make_scalp_surfaces.ZpyvistaÚtestrd   r{   r+   rŽ   z
lh.segheadr-   c                 S   s    t |ƒ|kst‚| |d |… fS )N)r�   ra   )ZpointsZ	trianglesZn_trianglesr>   r>   r?   Ú_decimate_surface¸  s    z<test_make_scalp_surfaces_topology.<locals>._decimate_surfaceZdecimate_surfaceZ_tri_levelsi;  )Úsparsez.*have fewer than three.*rL   FT)Úforcerl   i?  z.*is not complete.*)r²   rl   rQ   r(   z-head-sparse.fif)r²   rQ   Úignorer¬   N)rW   Zimportorskipr   r"   r   ÚsetattrÚmner(   r’   rX   rY   r   r^   Úis_filera   r£   r¤   r   r�   )	rc   Zmonkeypatchr}   ÚsubjectZsurf_dirrd   r°   Zbem_dirZsparse_pathr>   r>   r?   Ú!test_make_scalp_surfaces_topologyª  sZ    
    ÿ   ÿ   ÿr¸   Úbem_typeÚsphereÚn_posrj   rN   c                 C   s¨  | dkrPt t dddg¡dd�}|d d d }t |dddddddddg
¡}n*ttƒ}d}t dd	d
dddddddg
¡}t dddg|ddg| ddgd|dgd| dgdd|g| t d¡ |t d¡ dg| t d¡ | t d¡ dgd| t d¡ |t d¡ g|t d¡ |t d¡ |t d¡ gg
¡}|dk�r\|ddd…f }|d }t||ƒ}|dk�r‚t|tƒ�s”t	‚nt|tj
ƒ�s”t	‚t||ddd� dS )zTest distance_to_bem.rº   r   )Zr0rl   Zlayersr¦   r�   gš™™™™™©?g¨Å"~¬}‘?g¦V©ê/e?g6H5ªÛò„?gx[+Ò«ž—?gP÷	¹µù�?gŒÜO�yÿ¦?gluZ3	I„?gßxNåzü–?gTHC×Ï¬¨?g˜z«èî¾“?g       @g      @rj   Nr2   rœ   )r   r0   r¢   r   rb   Úsqrtr    Ú
isinstancers   ra   Zndarrayr   )r¹   r»   r(   rR   Z	true_distÚposÚdistr>   r>   r?   Útest_distance_to_bemÛ  sN             þ

 &öÿ


rÀ   )Sr   r   Úosr   Úos.pathÚpathrT   rƒ   ÚshutilÚnumpyr0   rW   Znumpy.testingr   r   rµ   r   r   r	   r
   r   r   r   r   r   r   r   Zmne.preprocessing.maxfilterr   Zmne.io.constantsr   Zmne.transformsr   Zmne.datasetsr   Z	mne.utilsr   r   Zmne.bemr   r   r   r   r   r   r   r   r    Zmne.surfacer!   r"   Zmne.ior#   rU   ÚdirnameÚ__file__rZ   Z	data_pathr}   r[   r‘   r_   rb   r­   r@   rF   ÚmarkZskipifZ	h5py_markZrequires_testing_dataZparametrizeÚparamre   rx   r’   Zslowtestr‰   rŒ   r“   rª   r®   r¸   rÀ   r>   r>   r>   r?   Ú<module>   s�   4,ÿ
ÿ
ÿ
ÿ
ÿ
ÿþ#þ
þ* 
0