U
    f»{j´[  ã                   @   s¬  d dl mZ d dlm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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( d dl)m*Z* d d	l+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d d
l2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z;m<Z< d dl=m>Z> d dl?m@Z@ d dlAmBZBmCZC e De EeF¡ddddd¡ZGe DeGd¡ZHe*jIdd�ZIe DeIddd¡ZJe DeIddd¡ZKe DeIddd¡ZLe DeId¡ZMe DeMdd¡ZNe DeNd ¡ZOe DeNd!¡ZPe DeNd"¡ZQe DeId#d$¡ZRe DeId#d%¡ZSd&d'„ ZTe
jUjVd(d)„ ƒZWd*d+„ ZXe
jYd,e* Z¡ gd-�d.d/„ ƒZ[d0d1„ Z\d2d3„ Z]d4d5„ Z^e
jUjVd6d7„ ƒZ_e
jUjVd8d9„ ƒZ`e
jUjVe*jad:d;„ ƒƒZbe*jad<d=„ ƒZcdS )>é    N)Údeepcopy)Úassert_allcloseÚassert_array_equal)Úread_source_spacesÚ
pick_typesÚ
read_transÚread_covÚmake_sphere_modelÚcreate_infoÚsetup_volume_source_spaceÚfind_eventsÚEpochsÚ
fit_dipoleÚtransform_surface_toÚmake_ad_hoc_covÚSourceEstimateÚsetup_source_spaceÚread_bem_solutionÚmake_forward_solutionÚconvert_forward_solutionÚVolSourceEstimateÚmake_bem_solution)Ú_surfaces_to_bem)Úread_head_posÚcompute_chpi_amplitudesÚcompute_chpi_locsÚcompute_head_posÚget_chpi_info)Ú_assert_quats)Útesting)Úsimulate_sparse_stcÚsimulate_rawÚadd_eogÚadd_ecgÚadd_chpiÚ	add_noise)Ú_compare_source_spaces)ÚSourceSimulator)ÚLabel)Ú_get_ico_surface)Úread_raw_fifÚRawArray)ÚFIFF)Ú	psd_welch)Úcatch_loggingÚcheck_versionz..ÚioZtestsÚdataztest_raw.fifF)ÚdownloadZMEGÚsamplezsample_audvis_trunc_raw.fifzsample_audvis_trunc-cov.fifzsample_audvis_trunc-trans.fifZsubjectsÚbemzsample-oct-2-src.fifzsample-320-320-320-bem-sol.fifzsample-320-bem-sol.fifZSSSztest_move_anon_raw.fifz!test_move_anon_raw_subsampled.posc                 C   s†   t | dd�}t |dd�}t|d d …d d…f |d d …d d…f ƒ t|d d …df |ƒ | d d… d }|d d… d }t||ƒ d S )NT©Úinitial_eventé   éÿÿÿÿr   )r   r   )Úraw_simÚraw_newZnew_event_idÚeventsZevents_tupleZdata_simZdata_new© r<   ú\/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/simulation/tests/test_raw.pyÚ_assert_iter_sim8   s    *r>   c               	      s:  t tƒ ¡ } |  | jdd… dg ¡ ttdddgdddggdddgdddggd�d	�}|jd
ksft‚d}t	d| j
d�}d| j
d  }tj d¡}t dg¡g}| dd¡}t||d|ƒ‰ tˆ jd tjƒsÐt‚tjtdd�� t| j
ˆ |||dƒ W 5 Q R X | dd¡}t| jƒd d d }t||d|ƒ‰ tˆ jd tjƒ�sFt‚t| j
ˆ gd |||d| jd�}	|	 d| jd ¡ t| j|	jƒ t|	dd�}
t|
ƒ|k�s¤t‚t|
dd…df dƒ tjtdd�� t| j
g |||dƒ W 5 Q R X t  tˆ jƒt!¡}d|d< t| j
ˆ |fgd |||d| jd�}|j"dk�s6t‚| d| jd ¡ t#|	|dƒ tjtdd��( t| j
ˆ |dd… fg|||dƒ W 5 Q R X tjtdd��$ t| j
ˆ |d fg|||dƒ W 5 Q R X ‡ fdd„}t| j
|ƒ |||d| jd�}| d| jd ¡ t#|	|dƒ ‡ fdd „}tjtd!d�� t| j
|ƒ |||dƒ W 5 Q R X t#|	|dƒ ‡ fd"d „}tjtd#d�� t| j
|ƒ |||dƒ W 5 Q R X t ddg¡g}| dd¡}t||d|ƒ‰ tˆ jd tjƒ�sÔt‚t$dƒ}|d$  d%9  < t%|gt&j'gd&gƒ}t(|ƒ}tj)t*d'd�� t| j
ˆ |||dƒ W 5 Q R X dS )(z'Test iterable support for simulate_raw.Né
   úSTI 014gš™™™™™©¿r   çš™™™™™¹?ç      ð?)ÚrrÚnn)ÚposZdiscrete)Zhead_radiusÚinfoÚsfreqé   r7   zat least three time points©Úmatchéè  é   ©Ú
first_sampr8   Tr5   z!Iterable did not provide stc\[0\]é   i˜:  z event data had shape .* but needzstim_data in a stc tuple .* intc                  3   s>   t  tˆ jƒt¡} d| d< d}|dk r:|d7 }ˆ | fV  qd S )Né   r   rL   rH   )ÚnpÚzerosÚlenÚtimesÚint)Z	stim_dataÚii©Ústcr<   r=   Ústc_iteru   s    ztest_iterable.<locals>.stc_iterrP   c                  3   s&   d} | dk r"| d7 } ˆ ddfV  qd S )Nr   éd   rH   rP   rO   r<   )rV   rW   r<   r=   Ústc_iter_bad�   s    z#test_iterable.<locals>.stc_iter_badzstc, if tuple, must be lengthc                  3   s>   d} | dk r:| d7 } ˆ   ¡ }t | d g¡|jd< |V  qd S )Nr   rZ   rH   r7   )ÚcopyrQ   ÚarrayÚvertices)rV   Zstc_newrW   r<   r=   r[   Š   s    zVertex mismatch for stc\[1\]rC   é<   g333333Ó?ú1 of 2 SourceEstimate vertices)+r*   Úraw_fname_shortÚ	load_dataÚpick_channelsÚch_namesr   ÚdictÚkindÚAssertionErrorr	   rF   rQ   ÚrandomZRandomStater]   Zrandnr   Ú
isinstancer^   ZndarrayÚpytestÚraisesÚ
ValueErrorr!   rS   rT   rN   Úcropr   r   r   ÚRuntimeErrorrR   rU   Ún_timesr>   r)   r   r,   ZFIFFV_BEM_SURF_ID_BRAINr   ÚwarnsÚRuntimeWarning)ÚrawÚsrcÚtransÚsphereÚtstepÚrngr^   r1   Zn_eventsr9   r;   Z
event_datar:   rY   r[   ZsurfÚmodelr4   r<   rW   r=   Útest_iterableB   sž    ÿÿÿÿ    ÿÿÿÿ  ÿry   c                 C   sH   d}| j d }d| }t| jƒd }t d|¡| }t|d||d�}|S )zMake a STC.é*   rG   rB   r?   r   ©Úrandom_state)rF   rS   rT   rQ   Úaranger    )rr   rs   ÚseedrG   rv   Z	n_samplesrT   rX   r<   r<   r=   Ú	_make_stc¤   s    
r   Úfunction)ÚscopeÚparamsc            	   	      s  t tƒ dd¡ ¡ ‰ tˆ jddd�} tˆ jdddd�}t t | ddd… |f¡¡}ˆ  	‡ fd	d
„|D ƒ¡‰ ˆ j 
¡  tt dtˆ jƒf¡tdgˆ jd dƒƒ}|j ¡ �  dD ]}ˆ j| |j|< q°W 5 Q R X ˆ  |g¡ ttƒ}ttƒ}tddˆ jƒ}tˆ |ƒ}ˆ ||||fS )zGet some starting data.ç        g      @T©ÚmegZeegF)r…   ÚstimZeogNé   c                    s   g | ]}ˆ j | ‘qS r<   ©rd   )Ú.0Úp©rr   r<   r=   Ú
<listcomp>·   s     zraw_data.<locals>.<listcomp>rH   zECG 063rG   Úecg)Ú
dev_head_tZhighpassZlowpassÚdigÚauto)r*   Ú	raw_fnamerm   rb   r   rF   rQ   ÚsortÚconcatenaterc   Únormalize_projr+   rR   rS   rT   r
   Ú_unlockZadd_channelsr   Ú	src_fnamer   Útrans_fnamer	   r   )	Z
data_picksZother_picksÚpicksr�   Úkeyrs   rt   ru   rX   r<   r‹   r=   Úraw_data¯   s$    
ÿ
rš   c                 C   sj   t ƒ }dddgdddgg}t|ƒD ]B\}}t| jd ƒ}|d d d…df  |7  < |d ||d < q"|S )Ngü©ñÒMbP?rƒ   gü©ñÒMbP¿rŽ   rt   rO   rB   )re   Ú	enumerater   rF   )rr   Úhead_pos_simZshiftsZtime_keyÚshiftZ
temp_transr<   r<   r=   Ú_get_head_pos_simÇ   s    rž   c              	   C   sb  d}| \}}}}}t t|jddd�ƒdks.t‚t|ƒ}t|ƒ}	|j ¡  ttƒ}
|jd |
d< |j	dd… |jd< t
d	d|jƒ}| ¡ jdd
�}t|j|||||	d�}t |d¡}| |¡ t|dd�}t|dd… d |dd… d ddd� ~t| ¡ jddd�j||||ƒ}t| ¡ jddd�j||||ƒ}t| ¡ jddd�j||||ƒ}|||fD ]}t||d� �q\||fD ]}t||d� �qxtjtdd�� t|ƒ W 5 Q R X tt |dd… d |dd… d f¡|dd… d ddd� ~~~t |jƒ}| ¡  d|d |jd  ¡}t |jƒt |jƒk�s4t‚t|j||||ƒ}tƒ �}t|j||||dd�}W 5 Q R X | ¡ }d|k�s„t‚t |jƒ|k�s˜t‚t|dd…d|…f d |dd…d|…f d ddd� ~~t|j|||||	dd�}t|j|||||	d d�}t|dd… d |dd… d d!d"d� ~td#d$ƒ�r^tj |¡}t||d� t||d� dS )%z.Test simulation of raw data with sphere model.rz   FT)r…   r�   rH   ZprojsNZbadsr�   ©r…   ©Úhead_poszsim_test_raw.fif)Zpreloadr   ç�íµ ÷Æ°>ç#B’¡œÇ;)ÚrtolÚatolr„   r{   zonly add ECG artifacts if MEGrI   gH¯¼šò×z>rƒ   rB   rG   )Úverbosez1 STC iteration providedçñhãˆµøä>g ÂëþKH´9Zlinear©r¡   ÚinterpZhannrA   g›+¡†›„=Únumpyz1.17) rS   r   rF   rg   Ústrrž   r”   r   Ú	cov_fnamerd   r	   r\   r!   ÚopÚjoinÚsaver*   r   r"   r#   rj   rk   rn   rQ   r“   rT   rm   r.   Úgetvaluer/   rh   Zdefault_rng)rš   Ztmp_pathr~   rr   rs   rX   rt   ru   Útempdirrœ   ÚcovZsphere_noradZraw_megr9   Ztest_outnameZraw_sim_loadedZraw_sim_megZraw_sim_eegZraw_sim_meegÚthis_rawZn_sampZraw_cropÚlogZ	raw_sim_2Zraw_sim_hannr|   r<   r<   r=   Útest_simulate_raw_sphereÔ   s¦    
ÿ
(   þ   þ   þ&  ÿ
ÿ  ÿ ÿ ÿ(rµ   c              	   C   s>  | \}}}}}|j }t|ƒ}|d d  d8  < tjtdd�� t||||||d� W 5 Q R X tjtdd�� td||||ƒ W 5 Q R X tjtd	d�� t|d|||ƒ W 5 Q R X tjtd
d��" t|| ¡  	dd¡|||ƒ W 5 Q R X tjtdd�� td||||ƒ W 5 Q R X | ¡ }| j
d7  _
tjtdd�� t|||||ƒ W 5 Q R X 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 t|ƒ}	|	d |	d< tjtdd�� t||||||	d� W 5 Q R X | ¡ }
|
j  ¡ � d|
j d< W 5 Q R X tjtdd�� t|
ƒ W 5 Q R X dS )zTest degenerate conditions.rB   )r7   rO   rA   zcollided with inner skullrI   r    zinfo must be an instance ofZfoozstc must be an instance ofz!stc must have at least three timer   zmust be an instance of Infozsame sample ratezinterp must be one of)r©   zunknown head_pos typeg      ð¿zAll position timesNr�   zCannot fit headshape)rF   rž   rj   rk   rn   r!   Ú	TypeErrorrl   r\   rm   rv   r•   r"   )rš   rr   rs   rX   rt   ru   rF   Zhp_errÚstc_badZhead_pos_sim_errZraw_badr<   r<   r=   Útest_degenerate#  sB    &ÿr¸   c           '   	   C   s8  | \}}}}}t ddtd�}|D ]B}d|d< |d d dd… |d< |d	  d
¡ d|d	 |d < q dd„ |D ƒ}tt tdd„ |D ƒƒ¡|d
d|jd  ƒ}|gd }	t|j|	|||ƒ}
t|j|	||t	ƒ}t
|
j|jƒ t|jddd�}t|ƒ}t |
| d
 || d
 ¡}t
|jd| d| fƒ t t |d|…| d…f ¡¡}|dk�sVt‚|D ]}t|d|ƒ �qZt dd„ |D ƒ¡}t|ƒd |jd  }t|jƒ}|
|df|t	dffD ]´\}}}t|dƒ}t|ƒdk�sÜt‚t||dd
|dd� ¡ }t|jƒt|ƒk�st‚t||||dd�d
 j}t tj|| d dd�¡d }t |¡}||k �s¶td ||f ƒ‚�q¶|j}t|dd!d"�}|dd…d
f }t|ƒdk�s¢t‚g g g g}t|d
 d d gd#d$�|d
< t|d
 d d% gd#d$�|d< t|d d d gd&d$�|d< t ddd
g¡}d
|fD ]j}t |d|jd  |d'�} t!dƒD ]"}!|  "||! ||tj#|!f ¡ �qB| j$|d t|ƒ | k�st‚�qt|j| |t	|d(�}"|" %¡ }#|#dd…|| f  &¡ }$|#dd…|d | f  &¡ }%|#dd…|d | f  &¡ }&t'|$|% |d
 |d  d)d*� |&d
k�s"t‚|"j$| j$k�s4t‚dS )+z%Test simulation of raw data with BEM.r3   Zoct1)Úsubjects_dirrO   ZnuserH   ÚvertnoNZinuser   c                 S   s   g | ]}|d  ‘qS ©rº   r<   ©r‰   Úsr<   r<   r=   rŒ   T  s     z)test_simulate_raw_bem.<locals>.<listcomp>c                 s   s   | ]}t |ƒV  qd S ©N©rS   )r‰   Úvr<   r<   r=   Ú	<genexpr>U  s     z(test_simulate_raw_bem.<locals>.<genexpr>rB   rG   rL   Tr„   r7   gÍÌÌÌÌÌä?Úheadc                 S   s   g | ]}|d  |d  ‘qS )rC   rº   r<   r¼   r<   r<   r=   rŒ   f  s     é   r@   é   )Zbaseline)Zmin_distr8   )ZaxisrK   z%s: %sF)r6   r¦   Zlh)ZhemirP   ZrhrM   )rs   r4   rN   r§   )r¤   )(r   r¹   Úfillr   rQ   ÚeyeÚsumrF   r!   Ú	bem_fnamer   rd   r   rS   ZcorrcoefÚshapeZmedianZdiagrg   r   r“   r   r   r   ZaveragerT   r   rE   ÚsqrtrN   r(   r]   r'   ÚrangeZadd_dataZnewaxisro   Úget_dataÚmaxr   )'rš   rr   Zsrc_ssrX   rt   ru   rs   r½   r^   ÚstcsZraw_sim_sphZraw_sim_bemr˜   Zn_chZcorrZmed_corrZlocsZtmaxr²   Zuse_rawr4   Ztolr;   ZevokedZfitsZdiffsZmed_diffrN   Z	evt_timesZ
labels_simZwf_simZthis_fsÚssÚir9   r1   Zamp0Zamp1Zamp2r<   r<   r=   Útest_simulate_raw_bemI  s€     ÿ
"
ÿ
 

ÿ $ÿrÑ   c              	   C   sJ  | \}}}}}|j ddd� ttƒ}| ¡ }| ¡ }| ¡ }	t|j|||ƒ}
tdd„ |D ƒƒtdd„ |
d D ƒƒ  kr€dks†n t‚|d d	 d
 |d d	 d
 ksªt‚||	ks¶t‚t||ƒ t	 
|
d ¡}|jd	t|ƒ|jd  dd� t|dd„ |
d D ƒd	d|jd  ƒ}d|
fD ]À}|dk�r:|||  }}}nd } }}t|j|||||d�}|j ddd� |d d	 d
 |d d	 d
 k�s�t‚||	k�sžt‚t||ƒ t|
dd�}t|dd… d	 |d d ddd� �qtjtdd�� t|j|||||
d� W 5 Q R X tjtdd�� t|jd|||dƒ W 5 Q R X d	|d	 d k�sPt‚d	|
d d	 d d	 gg g}t|dd … |d	d|jd  ƒ}tjtd!d�� t|j||||ƒ W 5 Q R X d	|
d d	 d k�sÒt‚tjtd!d�� t|j|ddd|
d� W 5 Q R X d|
d" d# d$ d%< tjtd&d�� t|j|ddd|
d� W 5 Q R X dS )'z*Test simulate_raw round trip calculations.T)r…   r†   c                 s   s   | ]}t |d  ƒV  qdS ©rº   Nr¿   r¼   r<   r<   r=   rÁ   œ  s     z+test_simulate_round_trip.<locals>.<genexpr>c                 s   s   | ]}t |d  ƒV  qdS rÒ   r¿   r¼   r<   r<   r=   rÁ   �  s     rs   é$   Zsurfsr   Zcoord_frameZnsourcerG   F)Zinclude_tmaxc                 S   s   g | ]}|d  ‘qS r»   r<   r¼   r<   r<   r=   rŒ   ¦  s     z,test_simulate_round_trip.<locals>.<listcomp>rB   N)Úforwardr„   )Zforce_fixedZsolr1   gê-�™—q=r¢   )r¥   r¤   zIf forward is not None thenrI   z"SourceEstimate, tuple, or iterablerƒ   rº   r7   r`   rF   rŽ   rt   )r   r   zdev_head_t.*does not match)r   r   Úbem_1_fnamer\   r   rF   rÇ   rg   r&   rQ   rÆ   rm   rS   r   r!   r   r   rj   rk   rl   r¶   rp   rq   )rš   rr   rs   rX   rt   ru   r4   Zold_bemZold_srcZ	old_transZfwdr1   Zuse_fwdZ	use_transZuse_srcZuse_bemr³   Zthis_fwdr^   r·   r<   r<   r=   Útest_simulate_round_trip�  sx    ÿþÿ
 ÿ
ÿÿ

 ÿ
  ÿÿ rÖ   c               
      s  t tdd�‰t tˆjƒ¡} t | tˆjddd�ddd… ¡} ˆ 	¡  
‡fdd„| D ƒ¡ ˆj ¡  td	d	ˆjƒ}t|d
 ƒ|jf }t|ddd�}tˆ|ƒgd }tˆj|d||tdˆjd�}t| ¡ tdd�}tˆjdd�\}}}	t|| d dƒ t|| d |	 ¡ ƒ tˆjddd�}
tˆjddd�}|
dd… |dd… fD ]�} t|| d�\}‰ t|| d�\}}tˆ |ƒ t ‡ fdd„|D ƒ¡}| |
k�rÆ|dd…|f d|dd…|f  k ¡ �sÔt‚nt||dd� �qFtˆdd�}tˆj|ƒ}t |j|ƒ}t!tƒ}t"||dd d!d"� dS )#z&Test simulation of raw data with cHPI.Úyes©Zallow_maxshieldTr„   NrP   c                    s   g | ]}ˆ j | ‘qS r<   rˆ   )r‰   Úpickr‹   r<   r=   rŒ   Ô  s     z*test_simulate_raw_chpi.<locals>.<listcomp>r�   Zr0g     €Q@Úm)ru   rE   Zsphere_unitsrL   Úzero)r¡   r©   rN   r¨   Úraise)Z
on_missingr   rƒ   FrO   )r˜   c                    s    g | ]}t  t  ˆ | ¡¡‘qS r<   )rQ   ZargminÚabs)r‰   Úf)Ú	freqs_simr<   r=   rŒ   ï  s   ÿrZ   r£   ©r¥   g      $@)Z
t_step_ming{®Gázt?g      @g¸…ëQ¸ž?)Zdist_tolZ	angle_tolZvel_atol)#r*   Úraw_chpi_fnamerQ   r}   rS   rd   Z	setdiff1dr   rF   rb   rc   r”   r	   ÚtupleZradiusr   r   r!   Ú	pos_fnamerN   r$   r\   r   r   rÇ   r-   r   r’   Úallrg   r   r   r   r   r   )r˜   ru   Z
sphere_volrs   rÎ   r9   Úraw_chpiZ	hpi_freqsZhpi_pickZhpi_onsZ	picks_megZ	picks_eegZpsd_simZpsd_chpiZ
freqs_chpiZfreq_idxZchpi_amplitudesZ	coil_locsZ	quats_simZquatsr<   )rß   rr   r=   Útest_simulate_raw_chpiÍ  sR    "
ÿ þ
ÿ
ÿ
ÿræ   c            
      C   s
  t tdd�} |  dd¡jdd� ¡  |  dd„ ¡ t|  ¡ d	ƒ |  ¡ }t	|dd
� |  ¡ }t
|dd
� |  ¡ }t| jƒ}t||dd
� |  ¡ }t|ƒ |  ¡ }t	|dd
� t
|dd
� t|ƒ t||dd
� | ¡ }d	}||||fD ]}	||	 ¡ 7 }qæt||dd� dS )z5Test that cascading operations do not overwrite data.r×   rØ   r   rH   TrŸ   c                 S   s
   t  | ¡S r¾   )rQ   Z
zeros_like)Úxr<   r<   r=   Ú<lambda>  ó    z)test_simulation_cascade.<locals>.<lambda>rƒ   r{   r£   rà   N)r*   rá   rm   r   rb   Zapply_functionr   rÌ   r\   r"   r#   r   rF   r%   r$   r   )
Zraw_nullZraw_eogZraw_ecgZ	raw_noiser²   rå   Zraw_cascadeZcascade_dataZserial_dataZ	raw_otherr<   r<   r=   Útest_simulation_cascade   s.    
rê   )dÚos.pathÚpathr­   r\   r   rª   rQ   Znumpy.testingr   r   rj   Zmner   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   Zmne.bemr   Zmne.chpir   r   r   r   r   Zmne.tests.test_chpir   Zmne.datasetsr   Zmne.simulationr    r!   r"   r#   r$   r%   Zmne.source_spacer&   Zmne.simulation.sourcer'   Z	mne.labelr(   Zmne.surfacer)   Zmne.ior*   r+   Zmne.io.constantsr,   Zmne.time_frequencyr-   Z	mne.utilsr.   r/   r®   ÚdirnameÚ__file__Ú	base_pathra   Z	data_pathr‘   r¬   r—   r¹   Zbem_pathr–   rÈ   rÕ   rá   rã   r>   ÚmarkZslowtestry   r   ZfixtureZ_pytest_paramrš   rž   rµ   r¸   rÑ   rÖ   Zrequires_testing_dataræ   rê   r<   r<   r<   r=   Ú<module>   sj   T 
ÿ
ÿ

a
O&
F
<1