U
    f»{jäw  ã                   @   sì  d dl mZ 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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 m!Z! d dl"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- e .e /e0¡d¡Z1e .e1d¡Z2e .e*j3dd�dd¡Z4e .e4d¡Z5e .e4d¡Z6e .e4d¡Z7dd„ Z8e*j9dd„ ƒZ:e*j9dd„ ƒZ;ej< =dddddd gd!fg¡d"d#„ ƒZ>e*j9d$d%„ ƒZ?e*j9ej< =d&d'¡d(d)„ ƒƒZ@d*d+„ ZAe*j9d,d-„ ƒZBej< =d.d/¡d0d1„ ƒZCd2d3„ ZDdS )4é    )ÚnullcontextN)Úassert_array_equalÚassert_allcloseÚassert_equal)Úpick_channelsÚ
pick_typesÚEpochsÚread_eventsÚset_eeg_referenceÚset_bipolar_referenceÚadd_reference_channelsÚcreate_infoÚmake_sphere_modelÚmake_forward_solutionÚsetup_volume_source_spaceÚpick_channels_forwardÚread_evokedsÚfind_events)Ú
BaseEpochsÚmake_fixed_length_epochs)ÚRawArrayÚread_raw_fif)ÚFIFF)Ú_has_eeg_average_ref_projÚ
Projection)Ú_apply_reference)Útesting)Úcatch_loggingÚ_record_warningsÚdataztest_raw.fifF)ÚdownloadZMEGÚsamplezsample_audvis_trunc_raw.fifzsample_audvis_trunc_raw-eve.fifzsample_audvis-ave.fifc                    s  t ˆ jdddd�}t ˆ jdddddd�}‡ fdd„|D ƒ}ˆ j}|j}|dk	rlt||d	|dd…f  d
¡ƒ |d	|dd…f }	|d	|dd…f }
|d	|dd…f }|d	|dd…f }t|
|ddd� |dk	�rtˆ tƒrö||dd…tj	dd…f  }n|| }t|	|ddd� dS )z4Test whether a reference has been correctly applied.FTÚbads©ÚmegÚeegÚexclude)r$   r%   ZeogZstimr&   c                    s   g | ]}ˆ j  |¡‘qS © )Úch_namesÚindex©Ú.0Úch©Úrawr'   úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/io/tests/test_reference.pyÚ
<listcomp>.   s     z#_test_reference.<locals>.<listcomp>N.éþÿÿÿç�íµ ÷Æ°>çVçž¯Ò<©Úatol)
r   ÚinfoÚ_datar   Zmeanr   Ú
isinstancer   ÚnpÚnewaxis)r.   ÚrerefÚref_dataÚref_fromÚ	picks_eegZpicks_otherZ	picks_refr7   Z_rerefZraw_eeg_dataZraw_other_dataZreref_eeg_dataZreref_other_dataZunref_eeg_datar'   r-   r/   Ú_test_reference&   s(     ÿ

r?   c                  C   s$  t tdd�} t|  ¡ ddgd�\}}|jd s2t‚t| ||ddgƒ t|jd ƒrVt‚t| ddgƒ\}}| |kstt‚t|  ¡ g ƒ\}}t| j	|j	ƒ t tdd�} t
tƒ}t| jddd	�}t| |d
dd|dd�}t| ¡ ddgd�\}}|jd sôt‚t|||ddgƒ | ¡ }t| ¡ ddgd�\}}|jd �s6t‚t|||ddgƒ t tdd�}t tt|dg¡ t tdd�} |  tdtddgdt d
d
gg¡dd
d�dd
d�¡ tjtdd�� t| dgƒ W 5 Q R X t| dgdgƒ | j ¡ � tj| jd< W 5 Q R X tjtdd�� |  ¡  W 5 Q R X dS )z%Test base function for rereferencing.T©ÚpreloadúEEG 001úEEG 002)r=   Úcustom_ref_appliedÚprojsF©r$   r%   é   çš™™™™™É¿ç      à?©ÚeventsÚevent_idÚtminÚtmaxÚpicksrA   Né   )Z	col_namesZ	row_namesr   ZncolZnrowÚtest)Úactiver   ÚdescÚkindzInactive signal space©ÚmatchúEEG 003úEEG 004zCannot set.* type 'CSD')r   Ú	fif_fnamer   Úcopyr6   ÚAssertionErrorr?   r   r   r7   r	   Ú	eve_fnamer   r   ÚaverageÚpytestÚraisesÚRuntimeErrorZadd_projr   Údictr9   ÚarrayÚ_unlockr   ZFIFFV_MNE_CUSTOM_REF_CSDr
   )r.   r;   r<   rK   r>   ÚepochsÚevokedZraw_npr'   r'   r/   Útest_apply_referenceL   sp     ÿ
 ÿ ÿ
 ÿ
ûöÿrf   c               	      s"  t tdd�‰ ˆ j ¡ � g ˆ jd< W 5 Q R X tˆ jd ƒr>t‚tˆ dd�\} }t| jd ƒs`t‚| jd d d rvt‚|dks‚t‚|  ¡  ‡ fdd	„tˆ jd
dd�D ƒ}t	ˆ | |‡ fdd	„|D ƒƒ t
jtdd�� tˆ d
dd�\} }W 5 Q R X |dksüt‚t td
d�}|j ¡ � g |jd< W 5 Q R X t|dd�\} }t| jd ƒ�sLt‚| jd d d �rdt‚tˆ ddgdd�\} }| jd �sŠt‚t	ˆ | |ddgƒ tˆ ddgd
d�\} }ˆ | k�sÀt‚tˆ ddgƒ\} }t| dd�\} }t| jd ƒ�söt‚| jd �rt‚ˆ  ¡ } | j ¡ � tj| jd< W 5 Q R X | jdd
d� t
jtt| dd� | jd tjk�sft‚tˆ dd�\} }t| ddgƒ\} }t| jd ƒ�rœt‚t| jd ƒdk�s´t‚| jd tjk�sÊt‚tˆ jd ƒ�sÞt‚tˆ g ƒ\} }tˆ j| jƒ t| jd ƒ�rt‚tˆ jd ƒ�s"t‚tˆ g ƒ\} }t| jd ƒ�rDt‚ˆ j ¡ � g ˆ jd< W 5 Q R X tˆ  ¡ dd�\}}| ¡  tˆ  ¡ d
d�\}}t|j|jddd� tˆ  ¡ dd
d�\} }t	ˆ | ||ƒ t
jtdd�� tˆ g d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 rereference eeg data.Tr@   rE   )Ú
projectionr   rR   Nc                    s   g | ]}ˆ j | ‘qS r'   )r(   r*   r-   r'   r/   r0   ¥   s   ÿz*test_set_eeg_reference.<locals>.<listcomp>FrF   c                    s   g | ]}|ˆ j d  kr|‘qS )r"   )r6   r*   r-   r'   r/   r0   ¨   s      Z	untouchedrU   )rZ   rg   rB   rC   ©rZ   rD   r2   r3   )Zrtolr5   r]   )Zref_channelsrg   z"supported for ref_channels="averag)r   rY   r6   rc   r   r[   r
   Ú
apply_projr   r?   r^   ÚwarnsÚRuntimeWarningrZ   r   ZFIFFV_MNE_CUSTOM_REF_ONr_   Ú
ValueErrorÚlenr   r7   r   )r;   r<   Z	eeg_chansZraw_nopreloadÚ_Zreref_1Zreref_2r'   r-   r/   Útest_set_eeg_reference—   s†    
ÿÿ
ÿ

ÿ
ro   zch_type, msg)Úauto©ÚECoG)Úecogrq   )Údbs)ÚDBSrs   rt   )rr   ru   c              	   C   s>  dddddg}t j d¡}| dd¡}t|t|d	d
gd dgd  dg ƒƒ}| dkrd|dd… }n| ¡ j| d�j}t	ƒ �}t
| ¡ | dd�\}}	W 5 Q R X d|› �| ¡ ks´t‚|jd sÂt‚t|||	|ƒ tjtdd�� t
|dd� W 5 Q R X t|tdd	dgd dg ƒƒ}
tjtdd�� t
|
dd� W 5 Q R X dS )z+Test setting EEG reference for ECoG or DBS.ZECOG01ZECOG02ZDBS01ZDBS02ZMISCr   é   éè  ç     @�@rs   rP   rt   Úmiscrp   N©rO   T)Úch_typeÚverbosezApplying a custom rD   zNo channels suppliedrU   r%   )r{   Úmagé   z8No EEG, ECoG, sEEG or DBS channels found to rereference.)r9   ÚrandomZRandomStateÚrandnr   r   rZ   Úpickr(   r   r
   Úgetvaluer[   r6   r?   r^   r_   rl   )r{   Úmsgr(   Úrngr   r.   Zref_chÚlogr;   r<   Zraw2r'   r'   r/   Útest_set_eeg_reference_ch_typeö   s.    	ÿÿ
ÿr†   c               	   C   sR  t tƒ dd¡jdddd� ¡ } dg| jd< | j | jd d ¡g}t 	t 
t| jƒ¡|¡}d	}td
d
| jƒ}td|dd�}|d d dks�t‚t| j|||ƒ}|  ¡ }|  ¡  d¡ ¡ }t|| || ƒ | jd|d� |  ¡ }	t|	| || ƒ t |	|  ¡ ||  ¡ ¡d }
t |	|  ¡ ||  ¡ ¡d }d|
  k �rLdk �sRn t‚d|  k �rjdk �spn t‚|  d¡ ¡ }t||dd� tjtdd�� |  d¡ W 5 Q R X t|| jd	d… ƒ}tjtdd�� | jd|d� W 5 Q R X ttdd�d }g |jd< |jdddd� t|jƒd k�s*t‚t d! d"¡t ¡}tj! "|¡}t #t $|j%d# ¡¡}|d$k�slt‚|j&d	d	…|f  ¡ }dtj! "|| ¡|  }d%|  k �r²d&k �s¸n t‚|jd|d� dtj! "|j&d	d	…|f | ¡|  }d'|  k �rd(k�s
n t‚dtj! "|j&d	d	…|f | ¡|  }d)|  k �rHdk�sNn t‚d	S )*zTest setting a REST reference.r   rG   FTr'   r#   zEEG 057r"   Nrp   g      4@g      >@)ÚposÚspherer&   Znuseéß   r]   ZREST)Úforward)r   rG   g333333ã¿g      à¿çš™™™™™¹?gš™™™™™É?gê-�™—q=r4   z forward when ref_channels="REST"rU   éÿÿÿÿzMissing channels)Nr   )Zbaselineé<   aÿ  -3.3265e-05 -3.2419e-05 -3.18758e-05 -3.24079e-05 -3.39801e-05 -3.40573e-05 -3.24163e-05 -3.26896e-05 -3.33814e-05 -3.54734e-05 -3.51289e-05 -3.53229e-05 -3.51532e-05 -3.53149e-05 -3.4505e-05 -3.03462e-05 -2.81848e-05 -3.08895e-05 -3.27158e-05 -3.4605e-05 -3.47728e-05 -3.2459e-05 -3.06552e-05 -2.53255e-05 -2.69671e-05 -2.83425e-05 -3.12836e-05 -3.30965e-05 -3.34099e-05 -3.32766e-05 -3.32256e-05 -3.36385e-05 -3.20796e-05 -2.7108e-05 -2.47054e-05 -2.49589e-05 -2.7382e-05 -3.09774e-05 -3.12003e-05 -3.1246e-05 -3.07572e-05 -2.64942e-05 -2.25505e-05 -2.67194e-05 -2.86e-05 -2.94903e-05 -2.96249e-05 -2.92653e-05 -2.86472e-05 -2.81016e-05 -2.69737e-05 -2.48076e-05 -3.00473e-05 -2.73404e-05 -2.60153e-05 -2.41608e-05 -2.61937e-05 -2.5539e-05 -2.47104e-05 -2.35194e-05ú gsh‘í|?µ?éª   gú~j¼t“x?gü©ñÒMb€?g{®Gázt?g;ßO�—n‚?g×£p=
×ï?)'r   rY   Úcropr   Ú	load_datar6   r(   r)   r9   Z	setdiff1dZarangerm   r   r   r[   r   Úget_datarZ   r
   r   ZcorrcoefZravelr   r^   r_   Ú	TypeErrorr   rl   r   Ú	ave_fnamerb   ÚsplitÚfloatZlinalgÚnormZargminÚabsÚtimesr   )r.   ZsamerO   Ztransrˆ   ÚsrcZfwdZ	orig_dataZavg_dataZ	rest_dataZ	orig_corrZavg_corrZ	avg_afterZfwd_badre   Zwantr—   ÚidxÚoldZexp_varZexp_var_oldr'   r'   r/   Útest_set_eeg_reference_rest  sl      ÿ

ÿÿ
ÿÿ
&&r�   Ú	inst_type)r.   rd   re   c              
   C   sÎ  t tdd�}| ¡  | dkr$|}~n<| dkr`t|dd�}t||dddd	�}|}| d
kr^| ¡ }~tjddœ}tj	t
dd�� t|ddd|ƒ W 5 Q R X | d¡ t|ddd|ƒ}|jd s¾t‚| ¡  ddg¡}|jdddd…f |jdddd…f  }| ¡  dg¡jdddd…f }t||ƒ d|jk�s2t‚d|jk�sBt‚d|jk�sRt‚|jd |j d¡ }	|jd |j d¡ }
|	D ]n}|dk�rª|	| tjk�sît|ƒ‚nD|dk�rÎ|	| tjk�sît|ƒ‚n |dk�r‚t|	| |
| |d� �q‚t|ddƒ}d|jk�st‚t|dddgdddgƒ}d|jk�s6t‚d|jk�sFt‚t|ddgdd gd!d"gdtjidtjigƒ}| ¡  dddd g¡}tj|jddd…dd…f |jddd#…dd…f  |jdd#d$…dd…f |jdd$d%…dd…f  gd&d'�}| ¡  d!d"g¡j}t||ƒ t|d(d)dtjid*d+�}|jd �r8t‚d,|jk�sHt‚t 	tt|dddgd¡ t 	tt|ddgdd¡ t 	tt|ddd!d"g¡ tj	tt|dddd-d.id-d.igd/� tj	tt|dddd0� dS )1zTest bipolar referencing.Tr@   r.   )rd   re   zSTI 014)Zstim_channelg333333Ó¿gffffffæ?)rM   rN   rA   re   zsome extra value)rT   Úextrazkey errantly presentrU   rB   rC   ZbipolarrŸ   rD   .r   NrG   ÚchsZ	coil_typerT   Úch_name)Úerr_msgzEEG 001-EEG 002rW   zEEG 001-EEG 003rX   Zbipolar1Zbipolar2rP   é   r~   r1   )ZaxiszMEG 0111zMEG 0112Úerror)Úch_infor|   zMEG 0111-MEG 0112ZfooÚbar)r¥   )r¡   )r   rY   ri   r   r   r]   r   ZFIFFV_EOG_CHr^   r_   ÚKeyErrorr   Úpopr6   r[   rZ   r   r7   r   r(   r)   ZFIFFV_COIL_EEG_BIPOLARr   r9   ÚconcatenateZFIFFV_MEG_CHrl   )rž   r.   ÚinstrK   rd   r¥   r;   ÚaÚbZbp_infoZan_infoÚkeyr'   r'   r/   Útest_set_bipolar_referenceR  sÄ    
    ÿ( 



þÿû..ÿý
þ
  ÿ
  ÿ
  ÿ
  þ
  ÿr®   c                 C   sB   t |tƒr|g}t| jd |ƒ}t|ƒt|ƒks4t‚| j ¡  dS )zCheck channel names.r(   N)r8   Ústrr   r6   rm   r[   Z_check_consistency)rª   Z	ref_namesÚref_idxr'   r'   r/   Ú_check_channel_namesµ  s
    
r±   c               
   C   sZ  t tdd�} t| jddd�}t tt| | jd d ¡ t| ddd�}t|j	j
d | j	j
d d	 ƒ t| j	|d
d
…f |j	|d
d
…f ƒ t|dƒ | jd }t| ddd�} t| j	|j	ƒ t| jd |d	 ƒ t| dƒ t| jd d d d
d… | jd |d  d dd… dƒ | j d¡}| | \}}t|dƒ t tƒ dd	¡ ¡ } t| jddd�}| jd= t| ddd�}t|j	j
d | j	j
d d	 ƒ t| j	|d
d
…f |j	|d
d
…f ƒ t|dƒ | jd }t| ddd�} t| j	|j	ƒ t| jd |d	 ƒ t| dƒ t tt| | jd d ¡ t| ddgdd�}t|ddgƒ t|j	j
d | j	j
d d ƒ t| j	|d
d
…f |j	|d
d
…f ƒ t|j	dd
…d
d
…f dƒ t| ddgdd�} t| ddgƒ | j d¡}| j d¡}| ||g \}}t|dƒ t tdd�} ttƒ}t| jddd�}t| |d	dd|dd�}	t tt|	d¡ t| |d	dd|ddd�}	t|	ddd�}
t|
j	j
d	 |	j	j
d	 d	 ƒ t|
dƒ |
j d¡}|
 ¡ d
d
…|d
d
…f }t|dƒ t|	jddd�}t|	 ¡ d
d
…|d
d
…f |
 ¡ d
d
…|d
d
…f ƒ t tdd�} ttƒ}t| jddd�}t| |d	dd|ddd�}	tjtdd�� t|	ddgdd�}
W 5 Q R X t|
j	j
d	 |	j	j
d	 d ƒ t|
ddgƒ |
j d¡}|
j d¡}t|
jd | d dƒ t|
jd | d dƒ |
 ¡ d
d
…||gd
d
…f }t|dƒ t|	jddd�}t|	 ¡ d
d
…|d
d
…f |
 ¡ d
d
…|d
d
…f ƒ t tdd�} ttƒ}t| jddd�}t| |d	dd|ddd�}	|	 ¡ }t|ddd�}t|jj
d |jj
d d	 ƒ t|dƒ |j d¡}|j|d
d
…f }t|dƒ t|jddd�}t|j|d
d
…f |j|d
d
…f ƒ t tdd�} ttƒ}t| jddd�}t| |d	dd|ddd�}	|	 ¡ }tjtdd�� t|ddgdd�}W 5 Q R X t|jj
d |jj
d d ƒ t|ddgƒ |j d¡}|j d¡}|j||gd
d
…f }t|dƒ t|jddd�}t|j|d
d
…f |j|d
d
…f ƒ t tdd�} tjtdd�� t| dgƒ W 5 Q R X |  ¡  tjtd d�� t| | jd
d	… ƒ W 5 Q R X tjtd!d�� t| d	ƒ W 5 Q R X t tƒjdd	dd"� ¡ } |  ¡  d#g¡jdd$�}| ¡ }t| ƒ ¡ }	|	 ¡  d#g¡jdd$�}| ¡ d }t||ƒ |	 ¡ }| ¡  d#g¡jdd$�}| ¡ }t||ƒ d
S )%zTest adding a reference.Tr@   FrF   r(   r   ZRefrh   rG   NZnchanr    rŒ   Úlocr£   é   r2   ÚdigZM1ZM2rP   r1   rH   rI   rJ   Zdelayed)rK   rL   rM   rN   rO   rA   Zprojzreference channels are ignoredrU   r¡   ZloadedzChannel.*already.*zinstance of)Zinclude_tmaxZREF)r%   )r   rY   r   r6   r^   r_   rl   r   r   r7   Úshaper   r±   r   r(   r)   r�   r‘   r	   r\   r   r`   r’   rj   rk   r]   r   r“   Ú	raw_fnamerZ   r   )r.   r>   Zraw_refZ
orig_nchanr°   r<   rn   Zref_idyrK   rd   Z
epochs_refre   Z
evoked_refr   Zdata_2Zdata_3r'   r'   r/   Útest_add_referenceÃ  s0    ÿ&


 ÿ
&



ÿ&
 ÿ  ÿ

ÿ  ÿ
ÿ  ÿ

ÿ  ÿ
ÿ
r·   Ún_ref)rG   rP   c              
   C   sv  t tƒ dd¡ ¡  d¡}t|jƒdks,t‚dd„ td| ƒD ƒdg }t	j
td	d
��& tƒ � t||dd� W 5 Q R X W 5 Q R X | ¡  | dkr˜tƒ }n| dks¤t‚t	jtdd
�}|� t||dd� W 5 Q R X | ¡ }t|d dƒ |j|  d… |ksþt‚| |jdd… |jdd…  ¡ |jdd„ td|  ƒD ƒk�sBt‚| ¡ }t |dd… |dd… g¡}t||ƒ dS )zCTest that a reference channel can be added and then data reordered.r   r‹   r%   r�   c                 S   s   g | ]}d d|  ‘qS )úEEG %03dr�   r'   ©r+   Úiir'   r'   r/   r0   s  s     z$test_add_reorder.<locals>.<listcomp>rG   zEEG 000rA   rU   Frh   rP   zlocations of multiplerŒ   g        Nc                 S   s   g | ]}d | ‘qS )r¹   r'   rº   r'   r'   r/   r0   ƒ  s     )r   r¶   r�   Zdel_projr�   rm   r(   r[   Úranger^   r_   r`   r   r   r‘   r   rj   rk   r’   r   Zreorder_channelsr9   r©   r   )r¸   r.   r    Úctxr   Zdata_newr'   r'   r/   Útest_add_reorderm  s*    """r¾   c                     sx  dd„ t dƒD ƒ‰ tˆ ddgtˆ ƒ d�} tj tˆ ƒd¡‰tˆ| ƒ}‡ ‡fdd	„}t|d
gdgdd�}||d
dƒ tt	 
ˆ d¡Ž \}}t|ƒt|ƒ }}t|||dd�}t||ƒD ]\}}||||ƒ q´t|jƒt|ƒksàt‚t|||ddd�}t|jƒt|ƒtˆ ƒ k�st‚tˆ ƒD ](\}}	ˆtj|f }
t| |	¡|
ƒ �qt|d
dgdd
gdd�}||d
dƒ ||dd
ƒ dS )z Test bipolar channel generation.c                 S   s   g | ]}d t |d ƒ ‘qS )ZCHrG   )r¯   )r+   Únir'   r'   r/   r0   ‹  s     z-test_bipolar_combinations.<locals>.<listcomp>é
   rx   r%   )r(   ZsfreqZch_typesrw   c                    sl   | j  |d | ¡g}| j|d�dd d …f }ˆˆ  |¡d d …f }ˆˆ  |¡d d …f }t||| ƒ d S )Nú-rz   r   )r(   r)   r’   r   )Úraw_testÚch_aÚch_brO   Zget_data_resZmanual_aZmanual_b©r(   Úraw_datar'   r/   Ú_check_bipolar‘  s
    z1test_bipolar_combinations.<locals>._check_bipolarZCH2ZCH1Trh   rP   F)Z	drop_refsrZ   N)r¼   r   rm   r9   r   r€   r   r   ÚzipÚ	itertoolsÚcombinationsÚlistr(   r[   Ú	enumerater:   r   r’   )r6   r.   rÇ   rÂ   Z
a_channelsZ
b_channelsrÃ   rÄ   r›   Zch_labelZ	manual_chr'   rÅ   r/   Útest_bipolar_combinations‰  sH      ÿ
    ÿ    ÿrÍ   )EÚ
contextlibr   rÉ   Úos.pathÚpathÚopÚnumpyr9   Znumpy.testingr   r   r   r^   Zmner   r   r   r	   r
   r   r   r   r   r   r   r   r   r   Z
mne.epochsr   r   Zmne.ior   r   Zmne.io.constantsr   Zmne.io.projr   r   Zmne.io.referencer   Zmne.datasetsr   Z	mne.utilsr   r   ÚjoinÚdirnameÚ__file__Úbase_dirr¶   Z	data_pathÚdata_dirrY   r\   r”   r?   Zrequires_testing_datarf   ro   ÚmarkZparametrizer†   r�   r®   r±   r·   r¾   rÍ   r'   r'   r'   r/   Ú<module>   sX   @&
J
^
ýÿ

:a
 *
