U
    f»{jžC  ã                   @   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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 d dlmZ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( d d
l)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1 e 2e 3e4¡dddd¡Z5e 2e5d¡Z6e 2e5d¡Z7e 2e5d¡Z8e 2e5d¡Z9e 2e5d¡Z:e 2ej;dd�dd¡Z<e 2e<d¡Z=e 2e<d¡Z>e 2e<d¡Z?e 2e<d¡Z@dd„ ZAd9d!d"„ZBejCd#d$„ ƒZDd%d&„ ZEejFjGd'd(„ ƒZHejF Id)d*ejJd+ g¡ejF Id,d-d.g¡d/d0„ ƒƒZKd1d2„ ZLd3d4„ ZMd5d6„ ZNd7d8„ ZOdS ):é    N)Úassert_array_almost_equalÚassert_allcloseÚassert_equal)Úlinalg)Úcompute_proj_epochsÚcompute_proj_evokedÚcompute_proj_rawÚ
pick_typesÚread_eventsÚEpochsÚsensitivity_mapÚread_source_estimateÚcompute_raw_covarianceÚcreate_infoÚread_forward_solutionÚconvert_forward_solution)Ú
regularizeÚcompute_whitener)Útesting)Úread_raw_fifÚRawArray)Úmake_projectorÚactivate_projÚ_needs_eeg_average_ref_proj)Úmaxwell_filter)Ú	read_projÚ
write_projÚmake_eeg_average_ref_projÚ_has_eeg_average_ref_proj)Ú_compute_rank_int)Ú_record_warningsz..ÚioZtestsÚdataztest_raw.fifztest-eve.fifztest-proj.fifútest-proj.fif.gzztest_bads.txtF)ÚdownloadZMEGÚsamplez)sample_audvis_trunc-meg-eeg-oct-4-fwd.fifz-sample_audvis_trunc-%s-oct-4-fwd-sensmap-%s.wzsample_audvis_eog-proj.fifzsample_audvis_ecg-proj.fifc                     s  t tdd�‰ttƒ} tˆjdddddd�}|ddd… }tˆ| |ƒ ˆ ‡fd	d
„|D ƒ¡ tˆ| ƒ ˆj ¡  tˆ| dd� t tdd�jddd�‰ˆj	dd� tˆ| dd� ˆj
dd… ˆjd< tˆ| dd� t tƒ‰t tˆjd¡ tˆjd ƒ}ˆ d¡ ttˆjd ƒ|d ƒ ˆ ¡  ttˆjd ƒdƒ t tƒ dd¡‰ˆj	dd� dgˆjd< tˆjddd�}‡fdd
„|D ƒ‰ ˆjd dd… D ]b}t dtˆ ƒf¡}‡ fdd
„|d d D ƒ}|d d |dd…|f< |d jt|ƒˆ |d� �q�ttˆdd�ˆjƒ dS )z-Test dealing with bad projection application.T©ÚpreloadFÚbads)ÚmegÚstimZecgÚeogÚexcludeé   é   é   c                    s   g | ]}ˆ j | ‘qS © ©Úch_names)Ú.0Úii©Úrawr0   úR/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/tests/test_proj.pyÚ
<listcomp>2   s     z!test_bad_proj.<locals>.<listcomp>r   )Úcount©r)   Úeeg©Z
projectionNé
   ÚfooÚprojsé   zMEG 0111r0   ©r)   r,   c                    s   g | ]}ˆ j | ‘qS r0   r1   )r3   Úpickr5   r0   r7   r8   O   s     éÿÿÿÿc                    s   g | ]}ˆ   |¡‘qS r0   )Úindex)r3   Zch_namer1   r0   r7   r8   R   s     r"   Ú	col_names)ZncolrE   r"   Úerror©Úverbose)r   Ú	raw_fnamer
   Úevent_fnamer	   ÚinfoÚ_check_warningsÚpick_channelsZnormalize_projÚset_eeg_referencer2   ÚpytestÚraisesÚ
ValueErrorÚdel_projÚlenr   ÚcropÚnpZzerosÚupdater   r   )ÚeventsÚpicksÚn_projZ	meg_picksÚpr"   Úidxr0   )r2   r6   r7   Útest_bad_proj)   sF     ÿ


r\   r/   c                 C   s\   t ƒ �&}t| |tddd�dd|ddd� W 5 Q R X t|ƒ|ksBt‚tdd	„ |D ƒƒsXt‚d
S )zCount warnings.r@   r/   )Zaud_lZvis_lçš™™™™™É¿ç      à?T)rX   r'   Úprojc                 s   s   | ]}d t |jƒkV  qdS )Z	dangerousN)ÚstrÚmessage)r3   Zwwr0   r0   r7   Ú	<genexpr>_   s     z"_check_warnings.<locals>.<genexpr>N)r    r   ÚdictrS   ÚAssertionErrorÚall)r6   rW   rX   r9   Úwr0   r0   r7   rL   Y   s        ÿrL   c               	   C   s¸  t tƒ} t| dd�} ttƒ}| ttƒ¡ d}dD �] }tt|df ƒj	}t
| d|ddd	�}t|j	||ƒ |jd
ksxt‚|dkr²tt|df ƒj	}t
| dd|dd�}t|j	||ƒ |dkrìtt|df ƒj	}t
| dd|dd�}t|j	||ƒ |dkr2ddddg}ddddg}t||ƒD ]<\}}	tt||	f ƒj	}t
| |||dd�}t|j	||ƒ �qq2t
| t| d ƒgddd�}tjtt
| ddd� tjtt
| g dd� t td¡}
t |
ƒ} t
| ƒ dS )z!Test sensitivity map computation.T)Zsurf_orié   )r;   ÚgradÚmagZlhNÚfreer(   )r?   Úch_typeÚmoder,   r%   rh   z2-lhZfixed)r?   rl   rk   r,   ri   z3-lhÚratior;   Z	radialityÚangleÚ	remainingZ	dampeningz4-lhz5-lhz6-lhz7-lhrK   )r?   rk   r,   )r?   rl   z%sample_audvis_trunc-meg-vol-7-fwd.fif)r   Ú	fwd_fnamer   r   Ú	eog_fnameÚextendÚ	ecg_fnamer   Úsensmap_fnamer"   r   r   Úsubjectrd   Úzipr   rO   rP   rQ   ÚRuntimeErrorÚopÚjoinÚsample_path)Zfwdr?   Zdecimrk   rf   ZstcÚmodesZendsrl   ÚendÚfnamer0   r0   r7   Útest_sensitivity_mapsb   s\    
 ÿ ÿ ÿ ÿ ÿr~   c              
   C   s²  t | ƒ}d\}}}ttdd�}ttƒ}d}t|jddddg d�}t||||||ddd�}	|	 ¡ }
t	|	d	d	d
d�}t
t |d¡|ƒ ttt |d¡fD �]f}t|ƒ}t|ƒt|ƒks¶t‚t||ƒD �]8\}}|d |d ksÞt‚|d d |d d ksút‚|d |d k�st‚|d d t |d d d ¡ }|d d t |d d d ¡ }||d d k�r°|d d  d¡}tj|jtd�}d||< |dd…|f }|dd…|f }t ||¡d }t|ddƒ |d rÀt|d tƒ�sèt‚t|d |d ƒ qÀq”t|ƒ}t||	jg d�\}}}|dk�s*t‚|j d	 dk�s>t‚|	j !¡ � |	jd  |7  < W 5 Q R X |	 ¡ }
|
 "t |d¡¡ ttƒ}t#|
d	d	d
d�}t|ƒdk�sªt‚t	|	d	d	d
dd�}t$dd„ |D ƒƒ�sÔt‚t|ƒ}t||	jg d�\}}}t%||dd d!� t |d"¡}t&j't(d#d$�� t
||ƒ W 5 Q R X t&j't(d#d$�� t|ƒ W 5 Q R X t |d%¡}t&j)t*dd$�� t
|d&ƒ W 5 Q R X t&j)t*d'd$�� t
|d&gdd(� W 5 Q R X dS ))zTest SSP computation on epochs.)r@   r]   g333333Ó?Tr&   zMEG 2443F)r)   r;   r*   r+   r,   N)rX   Zbaseliner_   r@   r   ©Ún_gradÚn_magÚn_eegr#   Údescr"   rE   Zactive)r   r   )Zdtype)r   r@   ç      ð?é   Zexplained_var©r(   r-   r?   zfoo-ave.fifÚfoobar)r€   r�   r‚   Zdesc_prefixc                 s   s   | ]}d |d kV  qdS )r‡   rƒ   Nr0   )r3   Úxr0   r0   r7   rb   Ó   s     z+test_compute_proj_epochs.<locals>.<genexpr>g:Œ0âŽyE>g¼‰Ø—²Òœ<)ZrtolZatolztest-bad-name.fif.gzz	-proj.fif©Úmatchzout-proj.fifr>   zprojs\[0\] must be .*©Ú	overwrite)+r`   r   rI   r
   rJ   r	   rK   r   Zaverager   r   rx   ry   Ú
proj_fnameÚproj_gz_fnamer   rS   rd   rv   rU   ÚsignrD   ZonesÚsizeÚboolZcorrcoefr   Ú
isinstanceÚfloatr   r   r2   ÚshapeÚ_unlockÚsaver   re   r   rO   ÚwarnsÚRuntimeWarningrP   Ú	TypeError)Útmp_pathÚtempdirZevent_idZtminZtmaxr6   rW   Zbad_chrX   ZepochsZevokedr?   Zp_fnameZprojs2Úp1Zp2Zp1_dataZp2_dataÚbadÚmaskZcorrr_   ÚnprojÚUZprojs_evokedZproj_parÚ_Zproj_badnamer}   r0   r0   r7   Útest_compute_proj_epochs“   s†    
ÿ ÿ
ÿ
""ÿ
ÿr¢   c              
   C   s˜  t | ƒ}d}ttƒ d|¡}| ¡  dD ]´}tjtdd�� t||d |dddd�}W 5 Q R X t	|ƒ}t
||jg d	�\}}}|d
ksˆt‚|jd d
ksšt‚|j ¡ � |jd  |7  < W 5 Q R X |jt |d| ¡dd� q(tjtdd�� t|d|dddd�}W 5 Q R X t	|ƒ}t
||jg d	�\}}}|d
k�s8t‚|jd d
k�sLt‚|j ¡ � |jd  |7  < W 5 Q R X | t |d¡¡ t |¡}	|	j|jd d
 d
dd� t|	d|dddd�}t	|ƒ}t
||jg d	�\}
}}t|
|dƒ | t¡ tjtdd�� t|dddd�}W 5 Q R X t|ƒdk�s.t‚|g fD ]\}t
||j|jd	�\}}}t|t t|jƒ¡ƒ |dk�svt‚|jt|jƒ|fk�s6t‚�q6dS )zTest SSP computation on raw.g      @r   )g      Ð?r^   r@   r-   zToo few samplesr‰   gš™™™™™¹?r@   )ÚdurationÚstopr€   r�   r‚   r†   r-   r?   zfoo_%d_raw.fifTr‹   Nzfoo_rawproj_continuous_raw.fifÚsfreqÚauto)Zn_jobsZnpadé   r   )r`   r   rI   rT   Ú	load_datarO   r—   r˜   r   r   r   r2   rd   r”   rK   r•   r–   rx   ry   ÚcpÚdeepcopyZresampler   Zload_bad_channelsÚ
bads_fnamerS   rU   Úeye)rš   r›   Zraw_timer6   r4   r?   r_   rŸ   r    Z
raw_resampZproj_newr¡   Zprojs_r0   r0   r7   Útest_compute_proj_rawç   sh      ÿ  ÿ
  ÿ
ÿr­   r£   r@   g       @r¥   g   €ëÄ‚@g     @�@c                 C   s|  d\}}t j d¡}| |d¡}| ||¡dddg }t  ||¡}t|t||dƒƒ}|jdd� tt	|j
d	 |  ƒƒ}	t|jƒ|	 |	 d |j
d	  }
| d|
¡ t||d
�}t|| |d�}t|d|d�}t|ƒt|ƒ  krôt|ƒ  krô|ksún t‚t||ƒD ]$\}}t|d d |d d ƒ �q|||fD ]B}t  dd„ |D ƒd¡}t  t |j|¡d ¡}|dk �s4t‚�q4dS )z'Test equivalence of `duration` options.)é   r/   r   i'  r@   r-   r;   Tr<   r¥   )r‚   )r£   r‚   Nr"   c                 S   s   g | ]}|d  d  ‘qS )r"   r0   )r3   rZ   r0   r0   r7   r8   C  s     z*test_proj_raw_duration.<locals>.<listcomp>gñhãˆµøä>)rU   ÚrandomZRandomStateZrandnÚdotr   r   rN   ÚintÚroundrK   rS   ÚtimesrT   r   rd   rv   r   ZconcatenateZrad2degr   Zsubspace_anglesÚT)r£   r¥   Zn_chZn_dimÚrngZsignalsZmixingr"   r6   Zn_effr¤   Zproj_defZproj_durZ	proj_noneZpuZpnr_   Zcomputedrn   r0   r0   r7   Útest_proj_raw_duration*  s(     0r¶   c               	   C   s  t tdd�} t| jddd�}t | j| jdd�dk ¡r<t‚t	| jƒ}|  
¡ }| |¡ | ¡  t|j| jdd�ddd	� | j ¡ � d| jd
< W 5 Q R X t tt	| j¡ | jdd� t| jd ƒsÊt‚| jdd� t| jd ƒrèt‚|  ¡  t| jd ƒ�rt‚dS )z&Test EEG average reference projection.Tr&   Fr:   r   )Zaxisg¬Ò¶OÉƒý;r.   )ÚdecimalÚcustom_ref_appliedr<   r?   rC   )r[   N)r   rI   r	   rK   rU   re   Ú_dataZmeanrd   r   ÚcopyÚadd_projÚ
apply_projr   r•   rO   rP   rw   rN   r   rR   )r6   r;   ÚcarZrerefr0   r0   r7   Útest_make_eeg_average_ref_projH  s"     

r¾   c                  C   s6   t g ƒrt‚ttƒ} | jdd� t | jd ƒs2t‚dS )z6Test checking whether an EEG average reference exists.Tr<   r?   N)r   rd   r   rI   rN   rK   r5   r0   r0   r7   Útest_has_eeg_average_ref_proje  s    r¿   c               	      s¬   t tƒ‰ tˆ jƒst‚ˆ jdd� tˆ jƒr0t‚t tdd�‰ ‡ fdd„tˆ jddd�D ƒ} ˆ  | ¡ tˆ jƒrrt‚t tƒ‰ ˆ j ¡ � dˆ jd< W 5 Q R X tˆ jƒr¨t‚d	S )
zATest checking whether a recording needs an EEG average reference.Tr<   r&   c                    s   g | ]}ˆ j | ‘qS r0   r1   )r3   Úcr5   r0   r7   r8   x  s     z3test_needs_eeg_average_ref_proj.<locals>.<listcomp>Fr:   r¸   N)	r   rI   r   rK   rd   rN   r	   Zdrop_channelsr•   )r;   r0   r5   r7   Útest_needs_eeg_average_ref_projn  s    
rÁ   c                  C   sr  t tƒ} |  dd¡ ¡ jddd� |  | jdd… ¡ ¡  t| dd	d
�}d}t	|j
d ƒdksbt‚dd|fdd|d ffD ]ò\}}}t|dd|dd�}| ¡  |¡ ¡ }t	|j
d ƒ|ks¾t‚t|ƒ}t|dd�}	t|	|j
dd�\}
}}||jksöt‚||  k�r|k�sn t‚|dk�r@|j
d d d d |k�slt‚qz|d	dd… }|j
d d d d |kszt‚qzdS )zTest `meg` proj option.r   r„   Tr0   rA   Né3   r…   r-   )Z	int_orderZ	ext_orderé   r?   Zseparaterg   Úcombinedr/   rF   )r€   r�   r)   rH   rG   )Zreturn_rankr"   rE   )r   rI   rT   r¨   r	   rM   r2   rR   r   rS   rK   rd   r   rº   r»   r¼   r   r   r   )r6   Zraw_sssZsss_rankr)   rY   Z	want_rankr_   Zthis_rawZsss_proj_rankZcovÚWr2   ZrankZ	mag_namesr0   r0   r7   Útest_sss_projƒ  s2    ÿ
ÿÿ
"rÆ   )Nr/   )Prº   r©   Úos.pathÚpathrx   ÚnumpyrU   Znumpy.testingr   r   r   rO   Zscipyr   Zmner   r   r   r	   r
   r   r   r   r   r   r   r   Zmne.covr   r   Zmne.datasetsr   Zmne.ior   r   Zmne.io.projr   r   r   Zmne.preprocessingr   Zmne.projr   r   r   r   Zmne.rankr   Z	mne.utilsr    ry   ÚdirnameÚ__file__Úbase_dirrI   rJ   r�   rŽ   r«   Z	data_pathrz   rp   rt   rq   rs   r\   rL   Zrequires_testing_datar~   r¢   ÚmarkZslowtestr­   ZparametrizeÚpir¶   r¾   r¿   rÁ   rÆ   r0   r0   r0   r7   Ú<module>   sR   8ÿ0
	
0T
B	