U
    f»{jS  ã                   @   s(  d dl mZ d dlmZ d dlZd dlZd dlm	Z	m
Z
mZmZ d dlZd dlmZ d dl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 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% e &ej'dd�d¡Z(e &e(d¡Z)e &e(d¡Z*e &e(d¡Z+e &e(d¡Z,e &e(d¡Z-e)e*gZ.e,e-gZ/e &e(d¡Z0e &e(d¡Z1e &e(d¡Z2e &e(d¡Z3e &e(d¡Z4e &e(d¡Z5e &e(d¡Z6e3e4gZ7e5e6gZ8e &e(d¡Z9ej:ej;j<de)ej=e3ej;j>e"dd� d d!�gd"�e0gej?d#�d$d%„ ƒƒZ@ej:d&d'„ ƒZAej; Bd(¡ej:ej; <d)e/ej=e8ej;jCej;j>e"dd� d d!�gd"�g¡d*d+„ ƒƒƒZDej:d,d-„ ƒZEej:d.d/„ ƒZFej; <de)e*g¡ej; Gd0¡ej:d1d2„ ƒƒƒZHej:d3d4„ ƒZIej:d5d6„ ƒZJd7d8„ ZKejLd9d:�d;d<„ ƒZMej:d=d>„ ƒZNej:d?d@„ ƒZOej:dAdB„ ƒZPej:dCdD„ ƒZQej:ej; <dEdF¡dGdH„ ƒƒZRdS )Ié    )ÚdeepcopyN)Úassert_array_equalÚassert_array_almost_equalÚassert_equalÚassert_allclose)Úio)Úwrite_eventsÚread_epochs_eeglab)Úread_custom_montage)Úread_raw_eeglab)Ú_get_montage_informationÚ_dol_to_lod)Ú_readmat)Ú_test_raw_reader)Útesting)ÚBunchÚ_check_pymatreader_installed)Úevents_from_annotationsÚread_annotationsF)ÚdownloadZEEGLABútest_raw.setztest_raw_onefile.setztest_raw_event_duration.setútest_epochs.setztest_epochs_onefile.setútest_raw_chanloc.setztest_raw_chanloc_fids.setztest_raw_2021.setztest_raw_h5.setztest_raw_onefile_h5.setztest_epochs_h5.setztest_epochs_onefile_h5.setztest_chans.locsÚfname)Ústrictzpymatreader not installed)Úreason)Zmarks)Zidsc              	   C   sn  t tƒ}dd„ tt|jƒƒD ƒ|_tt| d�}|  d¡r^tj	t
dd�� tf |Ž}W 5 Q R X n d| krtt| dd	�}n
tf |Ž}|  d¡r¤|j|d
d� | dd¡ n| |¡ |jdddddd� t| ddd�}|  d¡�rtj	t
dd�� tf |Ž}|j|d
d� W 5 Q R X ntf |Ž}| |¡ | tk�rjt|jƒdk�sBt‚t|jjƒddhk�s\t‚t|jjdƒ dS )ú!Test importing EEGLAB .set files.c                 S   s   g | ]}d   |¡‘qS )zEEG {0:03d})Úformat)Ú.0Úii© r    ú^/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/io/eeglab/tests/test_eeglab.pyÚ
<listcomp>C   s    z#test_io_set_raw.<locals>.<listcomp>)ÚreaderÚinput_fnamer   z#The data contains 'boundary' events©ÚmatchZ_h5T©ÚpreloadÚignore)Z
on_missingr   é   NÚautoÚzero)Zl_trans_bandwidthZfilter_lengthZphaseFÚascii)r$   r(   Zuint16_codecéš   ÚrtÚsquareç        )r
   Úmontage_pathÚrangeÚlenÚch_namesÚdictr   ÚendswithÚpytestÚwarnsÚRuntimeWarningr   Úset_montageÚcropÚfilterÚraw_fname_chanlocÚannotationsÚAssertionErrorÚsetÚdescriptionr   Úduration)r   ÚmontageÚkwsZraw0Zread_raw_kwsr    r    r!   Útest_io_set_raw2   sB    ÿ
ÿ


ÿÿ



rF   c                 C   s  t | ƒ} tjtddd�d }t | d¡}t|jd ƒ}d|_tj	|d|j
|j|jd|j||j|jdœidd	d
� t t td¡| dd¡¡ tjtdd�� t|dd� W 5 Q R X d|_tj	|d|j
|j|jd|j||j|jdœidd	d
� tjtdd��, tjtdd�� t|dd� W 5 Q R X W 5 Q R X t | d¡}tj	|d|j
|j|jd|j|jd |jd g|j|jdœidd	d
� t t td¡| dd¡¡ t|dd� t | d¡}t|jƒ}|D ]}tjg dd�|_�q¾tj	|d|j
|j|jd|j||j|jdœidd	d
� t t td¡| dd¡¡ t|dd�}|jjdk ¡ �sHt‚tj	|d|j
|j|jd|j|jd |jd g|j|jdœidd	d
� tjtdd�� t|dd� W 5 Q R X t | d¡}tj	|d|j
|j|jd|j|jd |jd g|j|jdœidd	d
� tjt dd�� t|dd� W 5 Q R X t | d¡}tj	|d|j
|jdtj! !d¡|j|jdd d!d"d#œ|j"d$d%… d%d&œ	idd	d
� t|dd� d'd(d)g}	d*d+tj#gd,d-tj#gd.d/tj#g  }
}}d0d1d2d3g}d0d3g}tj$d4|d�}tj$d4|d�}t%t&|	|
||ƒƒD ]T\}}t'd5ƒD ]@}|| || || d < |d6k�r|| || || d < �q�qt | d7¡}tj	|d|j
|jd%tj! !d8¡|j|j||j"d$d9… d9d&œ	idd	d
� t|dd�}t'd%ƒD ]T}t(|j)d: | d; |	| ƒ t*|j)d: | d< d$d%… t tj#tj#tj#g¡ƒ �q¼d$S )=r   FT©Zstruct_as_recordZ
squeeze_meÚEEGztest_negative_latency.setr   ztest_negative_latency.fdt©ÚtrialsÚsrateÚnbchanÚdataÚepochÚeventÚchanlocsÚpntsÚrow©Ú	appendmatÚoned_asztest_raw.fdtz.setz.fdtzhas a sample index of -1.r%   ©r$   r(   éÿÿÿÿzevent sample index is negativeztest_overlap_event.setztest_overlap_event.fdtztest_empty_durations.setÚfloat©Zdtypeztest_overla_event.fdtzmust have changed on diskztest_ovrlap_event.setznot find the .fdt data fileztest_one_channel.setr*   )r*   é   ZE1gÅ�1wmÀg½R–!Ž5@g™*•Ô‰À)ÚlabelsÚYÚXÚZNrZ   )	rJ   rK   rL   rM   rN   rO   rP   ÚtimesrQ   ZF3ÚunknownZFPzç      ð?ç       @ç      @ç      @ç      @ç       @©r[   ZS10©r]   Úf8©r\   ri   ©r^   ri   )rZ   é   )r   rZ   ztest_no_chanpos.set)rZ   é   rm   ÚchsZch_nameÚloc)+Ústrr   ÚloadmatÚraw_fname_matÚopÚjoinr   rO   ZlatencyÚsavematrJ   rK   rL   rN   rP   rQ   ÚshutilÚcopyfileÚbase_dirÚreplacer8   r9   r:   r   ÚraisesÚ
ValueErrorÚnpÚarrayrC   r?   Úallr@   ÚFileNotFoundErrorÚrandomr_   ÚnanZzerosÚ	enumerateÚzipr3   r   Úinfor   )Útmp_pathÚeegZnegative_latency_fnameZevntsZoverlap_fnameZempty_dur_fnameZevÚrawZone_chan_fnamer5   ÚxÚyÚzÚdtZnopos_dtrP   Znopos_chanlocsÚindÚvalsZfldZnopos_fnameÚir    r    r!   Útest_io_set_raw_moren   s:   ÿÿ
  ü ú
ÿ
  ü ú 
  ü ú
ÿ

  ü ú
ÿ
  ü ú
  ü ú
 
  ÿ û ù
(
 
   ý ûÿr�   é<   Úfnamesc              	   C   sb   | \}}t jtdd�� t|ƒ}W 5 Q R X t jtdd�� t|ƒ}W 5 Q R X t| ¡ | ¡ ƒ dS )z(Test importing EEGLAB .set epochs files.úmultiple eventsr%   N)r8   r9   r:   r	   r   Úget_data)r‘   Zepochs_fnameZepochs_fname_onefileÚepochsZepochs2r    r    r!   Útest_io_set_epochsø   s    r•   c                 C   sÆ   t | ƒ} t | d¡}t dddgdddgdddgd	ddgg¡}t||ƒ dddd
œ}t | d¡}tt||ƒ}tt	|j
ƒdƒ |js†t‚|js�t‚tt||ƒ}t tttd|¡ t ttt|j
d¡ dS )z4Test different combinations of events and event_ids.ztest-eve.fifrl   r   r*   é   rm   é   rZ   é   )zS255/S8ZS8zS255/S9N)rp   rs   rt   r|   r}   r   r	   Úepochs_fname_matr   r4   Úeventsr(   r@   Z_bad_droppedr8   rz   r{   )r…   Z	out_fnamerš   Úevent_idr”   r    r    r!   Útest_io_set_epochs_events  s&    *



 ÿ
 ÿrœ   c                 C   s®   t | ƒ} tjtddd�d }d|_t | d¡}tj|d|j|j	|j
|j|j|j|j|jdœiddd	� t t td
¡t | d¡¡ tjtdd�� t tt|¡ W 5 Q R X dS )z Test some degenerate conditions.FTrG   rH   zepochs_fname.datr   rI   rR   rS   ztest_epochs.fdtztest_epochs.datr’   r%   N)rp   r   rq   r™   rM   rs   rt   ru   rJ   rK   rL   rN   rO   rP   rQ   rv   rw   rx   r8   r9   r:   rz   ÚNotImplementedErrorr	   )r…   r†   Zbad_epochs_fnamer    r    r!   Útest_degenerate'  s6    ÿÿ
   ý û
ÿÿrž   zignore: Complex objectsc                 C   sF   t | ƒ}t|ƒdkst‚t|jƒddhks.t‚t |jdk¡sBt‚dS )z)Test reading annotations in EEGLAB files.r.   r/   r0   r1   N)r   r4   r@   rA   rB   r|   r~   rC   )r   r?   r    r    r!   Útest_eeglab_annotations=  s    
rŸ   c                  C   s”   t tƒ} ddddddddd	d
dddg}t dddddddddddddg¡}| jdksXt‚t| j| |dd� tt	dd�}t
|jjt d¡d ƒ dS ) z9Test annotations onsets are timestamps (+ validate some).r   r*   rm   rZ   é   é   é   é   é   é   é   é   é   ra   g
×£p=
û?g¤p=
×£ @gÍÌÌÌÌÌ@g×£p=
×@gš™™™™™&@g®Gáz.1@g3333334@g…ëQ¸:@g¤p=
×#=@g      A@gfffff&F@g33333“G@N)ÚdecimalTr'   g      à?)r   rr   r|   r}   Z	orig_timer@   r   Zonsetr   Úraw_fname_event_durationr   r?   rC   Zones)r?   Zvalidation_samplesZexpected_onsetr‡   r    r    r!   Útest_eeglab_read_annotationsM  s"         ÿ
 ÿr«   c                  C   sn   t  td¡} | }dddœ}t|dd�}t|ƒ}t|jƒdks@t‚| |¡ t	||d�\}}t|ƒdksjt‚d	S )
z(Test all forms of obtaining annotations.r   r*   rm   )r/   r0   FrV   r.   )r›   N)
rs   rt   rx   r   r   r4   r?   r@   Zset_annotationsr   )rr   Z	raw_fnamer›   Zraw1r?   Zevents_bÚ_r    r    r!   Útest_eeglab_event_from_annot^  s    

r­   c                 C   s@   t t | ¡t |¡ƒ t| t | ¡  |t | ¡  dd� d S )Ng:Œ0âŽyE>)Zatol)r   r|   Úisnanr   )ÚleftÚrightr    r    r!   Ú_assert_array_allclose_nanm  s    r±   Úsession)Úscopec                 C   s‚   t |  d¡d ƒ}tdddg g dt dddg¡t ddg¡tjd	d
tjtjtjfdgddddgd�dœ	d�}tj||ddd� |S )a0  Test file with 3 channels to exercise EEGLAB reader.

    File characteristics
       - ch_names: 'F3', 'unknown', 'FPz'
       - 'FPz' has no position information.
       - the rest is aleatory

    Notes from when this code was factorized:
    # test reading file with one event (read old version)
    rM   ztest_chanpos.setr*   rZ   é€   r1   gš™™™™™¹?gš™™™™™É?)s   F3ra   rc   re   s   unknown)s   FPzrb   rd   rf   rg   rh   rj   rk   rY   )	rJ   rL   rQ   rN   rO   rK   r_   rM   rP   )rH   FrR   )Ú	file_nameZmdictrT   rU   )	rp   Úmktempr6   r|   r}   Úemptyr�   r   ru   )Ztmp_path_factoryr   Zfile_conentr    r    r!   Úone_chanpos_fnamer  s,         þ
üü

ÿr¸   c                 C   s  t j}t  dddddd||||||g||||||||||||gdddddd||||||gg¡}t  ||||||||||||g||||||||||||g||||||||||||gg¡}t| dd	�}tt  d
d„ |jd D ƒ¡|ƒ t| dd	� d¡}tt  dd„ |jd D ƒ¡|ƒ dS )zETest reading file with 3 channels - one without position information.g      Àra   re   r1   g      Àrb   rf   TrV   c                 S   s   g | ]}|d  ‘qS ©ro   r    ©r   Úchr    r    r!   r"   ¢  s     z-test_position_information.<locals>.<listcomp>rn   Nc                 S   s   g | ]}|d  ‘qS r¹   r    rº   r    r    r!   r"   ®  s     )r|   r�   r}   r   r   r„   r;   r±   )r¸   r�   ZEXPECTED_LOCATIONS_FROM_FILEZEXPECTED_LOCATIONS_FROM_MONTAGEr‡   r    r    r!   Útest_position_information‘  s0    ýýÿþýÿr¼   c                   C   s&   dt  t¡kst‚tttddd� dS )z5Test reading new default file format (no EEG struct).rH   FT)r#   r$   Ztest_preloadingr(   N)r   rq   Úraw_fname_2021r@   r   r   r    r    r    r!   Útest_io_set_raw_2021²  s
     ÿr¾   c                	   C   s&   t jtdd�� ttƒ W 5 Q R X dS )z0Test reading raw set file as an Epochs instance.ztrials less than 2r%   N)r8   rz   r{   r	   rr   r    r    r    r!   Útest_read_single_epochº  s    r¿   c               	   C   sn  t tƒ} t| d d d ƒ}dg|d  dg dg | d d d< t| d d ƒ| d d< tf | d Ž| d< t| d d	ƒ\}}}t|ƒt|ƒ  krœ|ks¢n t‚|dg|d  dg dg ksÄt‚|d
ksÐt‚t tƒ} t| d d d ƒ}dg|d  dg dg | d d d< t| d d ƒ| d d< tf | d Ž| d< tjt	dd�� t| d d	ƒ\}}}W 5 Q R X d
S )z2Test that the channel types are properly returned.rH   rP   r[   r†   rm   ZeogZstimÚtypeFNr`   zUnknown types foundr%   )
r   Úraw_fname_onefile_matr4   r   r   r   r@   r8   r9   r:   )ZmatÚnr5   Zch_typesrD   r    r    r!   Ú"test_get_montage_info_with_ch_typeÁ  s"    &""&ÿrÃ   Úhas_type)TFc                 C   s  |s dd„ }|   tjjjd|¡ ttƒ}| ¡ }| ¡ }d}|sŠ|d dksPt‚|d dks`t‚|d dkspt‚t	|j
d	 ƒ|ks†t‚dS |d dk	sšt‚|d dk	sªt‚|d dk	sºt‚t	|d ƒd
ksÎt‚t	|d ƒd
ksât‚t	|d ƒd
ksöt‚t	|j
d	 ƒ|d
 k�st‚dS )z,Test reading file with 3 fiducial locations.c                 S   s   | j d d= t| |ƒS )NZ
nodatchansrÀ   )Zchaninfor   )r†   Zget_posr    r    r!   Úget_bad_informationÞ  s    z:test_fidsposition_information.<locals>.get_bad_informationr   é�   ZnasionNZlpaZrpaÚdigrZ   )ÚsetattrÚmner   Zeeglabr   Úraw_fname_chanloc_fidsZget_montageZget_positionsr@   r4   r„   )ZmonkeypatchrÄ   rÅ   r‡   rD   ÚposZn_eegr    r    r!   Útest_fidsposition_informationÙ  s,    ÿrÌ   )SÚcopyr   Úos.pathÚpathrs   rv   Únumpyr|   Znumpy.testingr   r   r   r   r8   Zscipyr   rÉ   r   r	   Zmne.channelsr
   Zmne.ior   Zmne.io.eeglab.eeglabr   r   Zmne.io.eeglab._eeglabr   Zmne.io.tests.test_rawr   Zmne.datasetsr   Z	mne.utilsr   r   Zmne.annotationsr   r   rt   Z	data_pathrx   rr   rÁ   rª   r™   Zepochs_fname_onefile_matZraw_mat_fnamesZepochs_mat_fnamesr>   rÊ   r½   Zraw_fname_h5Zraw_fname_onefile_h5Zepochs_fname_h5Zepochs_fname_onefile_h5Zraw_h5_fnamesZepochs_h5_fnamesr2   Zrequires_testing_dataÚmarkZparametrizeÚparamZskipifÚbasenamerF   r�   ÚtimeoutZslowtestr•   rœ   rž   ÚfilterwarningsrŸ   r«   r­   r±   Zfixturer¸   r¼   r¾   r¿   rÃ   rÌ   r    r    r    r!   Ú<module>   sÂ   
þÿþ	õô.
 


þþþþ

þ





 


