U
    f»{j#e  ã                   @   sP  d dl mZ d dlmZ d dlmZ d dlmZ d dl	Z	d dl
Z
d dlZd dlmZ d dlmZmZmZ d dlmZmZmZmZmZmZmZmZ d dlmZmZmZm Z  d d	l!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/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8 d dl9m:Z: e ;e <e=¡ddd¡Z>e ;e>dd¡Z?e ;e?d¡Z@e ;e?d¡ZAe ;e>dddd¡ZBe5jCdd�ZDe
jE Fdd¡e
jE Fdd¡dd„ ƒƒZGdd„ ZHd d!„ ZId"d#„ ZJd$d%„ ZKd&d'„ ZLe
jEjMd(d)„ ƒZNd*d+„ ZOe8d,ƒe5jPd-d.„ ƒƒZQe5jPd/d0„ ƒZRe5jPd1d2„ ƒZSd3d4„ ZTd5d6„ ZUd7d8„ ZVd9d:„ ZWd;d<„ ZXe7d=d>„ ƒZYdS )?é    N)ÚPath)Údeepcopy)Úpartial)Úsavemat)Úassert_array_equalÚassert_equalÚassert_allclose)Úrename_channelsÚread_ch_adjacencyÚcombine_channelsÚfind_ch_adjacencyÚmake_1020_channel_selectionsÚread_custom_montageÚequalize_channelsÚget_builtin_ch_adjacencies)Ú_ch_neighbor_adjacencyÚ_compute_ch_adjacencyÚ_BUILTIN_CHANNEL_ADJACENCIESÚ_BuiltinChannelAdjacency)Ú	read_infoÚread_raw_fifÚread_raw_ctfÚread_raw_btiÚread_raw_eeglabÚread_raw_kitÚRawArray)ÚFIFF)Ú
pick_typesÚpick_channelsÚEpochsArrayÚEvokedArrayÚmake_ad_hoc_covÚcreate_infoÚread_eventsÚEpochs)Útesting)Úrequires_pandasÚrequires_version)Úparallel_funcz..ÚioZtestsÚdataztest_raw.fifztest-eve.fifZkitztest.sqdF)ÚdownloadÚpreload)TFÚprojc              	   C   sþ  t tƒ dd¡ ¡ }|r*t t|jƒ¡|_| r6| 	¡  |rv| svt
jtdd��  | ¡  |jddd… ¡ W 5 Q R X dS | ¡  |jddd… ¡}|j|jddd… ksªt‚|rÂt|j|jdd� n|jdksÐt‚|jdksÞt‚t|dd… d |dd… d ddd… ƒ | |jddd… d	d… ¡ | |jdd	… |jdd…  ¡ t|dd… d |dd… d ƒ t
jtd
d��( | |jdd	… |jdd	…  ¡ W 5 Q R X d	dgttdt|jƒƒƒ }t |¡}| ¡  |¡}t|dd… d || d ƒ dS )zTest reordering of channels.r   çš™™™™™¹?z	load data©ÚmatchNéÿÿÿÿgê-�™—q=)Zatolé   Zrepeatedé   )r   Ú	raw_fnameÚcropZdel_projÚnpÚeyeÚlenÚch_namesZ
_projectorÚ	load_dataÚpytestÚraisesÚRuntimeErrorÚcopyZreorder_channelsÚAssertionErrorr   r   Údrop_channelsÚ
ValueErrorÚlistÚrangeZargsortÚpick)r,   r-   ÚrawZraw_newZreordÚrev© rG   ú_/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/channels/tests/test_channels.pyÚtest_reorder_channels+   s2    $,"",
rI   c                  C   s¶  t tƒ} ddi}t tt| |¡ ddi}t tt| |¡ ddi}t tt| |¡ t tt| d¡ t tt| d¡ t| ƒ}ddg|d< dd	d
œ}t||ƒ |d d d dks°t‚|d d dksÄt‚|d d d d	ksÜt‚|d d d	ksðt‚t	dd	g|d ƒ t| ƒ}t|dd„ ƒ |d d d dk�s2t‚t| ƒ}ddg|d< t||ƒ t	ddg|d ƒ t
tƒ dd¡}d\}}|di|_| ||i¡ ||jk�s¢t‚||jk�s²t‚dS )zTest rename channels.úEEG 160ÚEEG060zMEG 2641ç      ð?zMEG 2642úEEG 060úEOG 061ÚbadsZEOG061)rM   rN   Úchsév  Úch_namer9   éw  c                 S   s   |   dd¡S )Nú Ú )Úreplace)ÚxrG   rG   rH   Ú<lambda>j   ó    z&test_rename_channels.<locals>.<lambda>éu  ZEEG059r   r.   )rM   ZNewÚVN)r   r4   r;   r<   rA   r	   Ú	TypeErrorr   r?   r   r   r5   Z_orig_units)ÚinfoÚmappingZinfo2rE   ÚoldÚnewrG   rG   rH   Útest_rename_channelsM   s>    



ra   c               
   C   s~  t tƒ} ddi}tjtdd�� |  |¡ W 5 Q R X ddi}tjtdd�� |  |¡ W 5 Q R X dd	d
dddddddœ	}t tƒ}dddg|jd< tjtdd�� | |¡ W 5 Q R X |jg dd� tj	t
dd�� | |¡}W 5 Q R X |j}|d d d dk�st‚|d d d tjk�s"t‚|d d d tjk�s>t‚|d d d tjk�sZt‚|d d d d k�stt‚|d d d tjk�s�t‚|d d d tjk�s¬t‚|d d d tjk�sÈt‚|d d! d dk�sât‚|d d! d tjk�sþt‚|d d! d tjk�st‚|d d! d tjk�s6t‚|d d" d dk�sPt‚|d d" d tjk�slt‚|d d" d tjk�sˆt‚|d d" d tjk�s¤t‚|d d# d dk�s¾t‚|d d# d tjk�sÚt‚|d d# d tjk�söt‚|d d# d tjk�st‚t| jd$d%gƒD ]Z}|d | d tjk�sBt‚|d | d tjk�s^t‚|d | d tjk�s"t‚�q"t| jd&gƒd' }|d | d tjk�s¬t‚|d | d tjk�sÈt‚|d | d tjk�sät‚t| jd(gƒd' }|d | d tjk�st‚|d | d tjk�s.t‚|d | d tjk�sJt‚d)| jd d' d< | jd' d*i}t t| j|¡ d+S ),zTest set_channel_types.rJ   rK   zname \(EEG 160\) doesn't existr/   rN   Zxxxz"cannot change to this channel typeZdbsZecogZecgÚeogZseegÚeegZhboÚresp)	úEEG 057úEEG 058úEEG 059rM   rN   úMEG 2441úMEG 2443úMEG 2442úEEG 001rg   rM   rO   ztype .* in projector "PCA-v1"T)Zremove_existingzunit for channel.* has changedrP   is  rR   re   ÚkindÚunitZ	coil_typeit  rf   rZ   rQ   rS   rh   ri   rj   r   rk   g        ÚmiscN)r   r4   r;   r<   rA   Zset_channel_typesr]   r=   Zadd_projÚwarnsÚRuntimeWarningr?   r   ZFIFFV_DBS_CHZFIFF_UNIT_VZFIFFV_COIL_EEGZFIFFV_ECOG_CHZFIFFV_ECG_CHZFIFFV_COIL_NONEZFIFFV_EOG_CHZFIFFV_SEEG_CHr   r9   ZFIFFV_EEG_CHZFIFFV_FNIRS_CHZFIFF_UNIT_MOLZFIFFV_COIL_FNIRS_HBOZFIFFV_RESP_CH)rE   r^   Úraw2r]   ÚidxÚch_typesrG   rG   rH   Útest_set_channel_types{   st        þ rt   c                  C   sb   t ƒ } | st‚t| ƒtt| ƒƒks&t‚t| ƒttƒks:t‚t dd�}|D ]}t|ƒdksHt‚qHdS )z>Test retrieving the names of all built-in FieldTrip neighbors.T)Zdescriptionsr3   N)r   r?   r8   Úsetr   )ÚnamesZnames_and_descriptionsZname_and_descriptionrG   rG   rH   Útest_get_builtin_ch_adjacencies¼   s    
rw   c                 C   sÞ  t | ƒ}ttjdd�}tjdg|dgƒggfdg|dgƒg|dgƒggfdg|dgƒg|dgƒggfggddgd�}t|d�}t |d	¡}t||d
d� t|ƒ\}}|}t	|j
d t|ƒƒ t	|j
dƒ t	|d dƒ t	|d dƒ t | ¡ ¡söt‚t tt|ddg¡ t|ddgd�\}}t	|j
d dƒ t	t|ƒdƒ dddg}dgdgdgg}	t tt||	¡ dgddgdgg}	t tt|dd… |	¡ dgddgg}	t tt||	¡ tdƒ\}
}t	|
j
dƒ t	t|ƒdƒ t ttd¡ ttjƒ}tjdgg fd g|d!gƒg|d"gƒggfd!g|d gƒg|d"gƒggfd"g|d gƒg|d!gƒggfggddgd�}t|d�}t |d#¡}t||d
d� t|ƒ\}}| ¡ }t	|j
d t|ƒƒ t	|j
d$ƒ t | ¡ ¡�sÈt‚t |dd%d…f ¡�rät‚t |d%d…df ¡�r t‚ttjƒ}tjdgg fd g|d&gƒg|d"gƒggfd!g|d gƒg|d"gƒggfd"g|d gƒg|d!gƒggfggddgd�}t|d�}t |d'¡}t||d
d� t tt|¡ tƒ D ]&}t|ƒ\}}t	|j
d t|ƒƒ �q²dS )(z)Test reading channel adjacency templates.z<U7)ZdtypeZMEG0111ZMEG0131ZMEG0121)ÚlabelÚO)Zneighblabelry   )Z
neighboursztest_mat.matÚrow)Zoned_asr   )é   r{   )r   r2   F)r   r3   Tr{   r3   ©ÚpicksZEEG01ZEEG02ZEEG03ZEEG04zEEG 02NZneuromag306mag)éf   r~   r~   zbananas!ZE31ZE1ZE2ZE3ztest_isolated_mat.mat)é   r   r2   ZE8ztest_error_mat.mat)Ústrr   r6   ÚarrayÚdictÚopÚjoinr   r
   r   Úshaper8   ÚallZdiagonalr?   r;   r<   rA   r   ZtodenseÚanyr   )Útmp_pathÚtempdirÚaZnbhZmatZ	mat_fnameZch_adjacencyr9   rW   Ú	neighborsZ	adjacencyÚnamerG   rG   rH   Útest_read_ch_adjacencyÈ   s¨    
ÿ
ÿýû

ÿ

ÿ
ÿ
ÿûù


ÿ
ÿ
ÿûù

r�   c                    s>   t dœ‡fdd„}t|dd�\}‰ }|‡ fdd„tD ƒƒ dS )	z,Download the known neighbors from FieldTrip.)Úneighborc                    s8   dd l }| ¡  d¡ | j}| j}|j|d |ˆ d� d S )Nr   ÚERROR)ÚurlZ
known_hashÚfnameÚpath)ÚpoochZ
get_loggerÚsetLevelr‘   Ú
source_urlÚretrieve)rŽ   r“   r‘   r�   ©Ú
target_dirrG   rH   Ú_download_one_ft_neighbor  s    üz9_download_ft_neighbors.<locals>._download_one_ft_neighborr1   )ÚfuncZn_jobsc                 3   s    | ]}|j d k	rˆ |ƒV  qd S )N)r•   )Ú.0rŽ   )Úp_funrG   rH   Ú	<genexpr>2  s   
þz)_download_ft_neighbors.<locals>.<genexpr>N)r   r(   r   )r˜   r™   ÚparallelÚ_rG   )rœ   r˜   rH   Ú_download_ft_neighbors  s    ÿ ÿþr    c           	   
   C   sÎ   t tƒjd d d }| }~ t|d� tD ]ž}|j}||  ¡ sBq*t ¡ }t ¡ }t	|| dƒ�}| 
¡ }| |¡ W 5 Q R X t	|| dƒ�}| 
¡ }| |¡ W 5 Q R X | ¡ | ¡ kr*td|› �ƒ‚q*dS )z@Test correspondence of built-in adjacency matrices with FT repo.r2   r*   r‹   r—   Úrbz;Hash mismatch between built-in and FieldTrip neighbors for N)r   Ú__file__Úparentsr    r   r‘   ÚexistsÚhashlibÚsha256ÚopenÚreadÚupdateÚ	hexdigestrA   )	rˆ   Zbuiltin_neighbors_dirZft_neighbors_dirZadjr‘   Zhash_mneZhash_ftÚfr*   rG   rG   rH   Útest_adjacency_matches_ft9  s(    
ÿr¬   c                  C   sà   t tƒ} t| jddd�}t dd„ | jd D ƒ¡| }| j|d�}t||ƒ | jd d	 }t 	t
| jd
dgdg¡ t tƒ}t d
ddg¡|jd d	 d dd…< |  d
ddgg|g¡ t| jd d	 d |jd d	 d ƒ dS )z,Test get/set functions for sensor positions.FT)Úmegrc   c                 S   s   g | ]}|d  dd… ‘qS )ÚlocNr{   rG   ©r›   ÚchrG   rG   rH   Ú
<listcomp>]  s     z1test_get_set_sensor_positions.<locals>.<listcomp>rP   r|   r9   é   r2   r3   rŒ   r{   r®   N)r   r4   r   r]   r6   r�   Z_get_channel_positionsr   r;   r<   rA   Z_set_channel_positions)Zraw1r}   ÚposZraw_posrR   rq   rG   rG   rH   Útest_get_set_sensor_positionsY  s    
&ÿr´   Zpymatreaderc                     s  t  tdd¡} t  tdd¡}t| dd�‰ t|ƒ}ˆ  ttˆ j|jƒƒ¡‰ ˆ  	|¡ ddˆ dd	gfD ]}t
 tt|¡ qbtˆ jƒ}| ¡ D ]H\}}t‡ fd
d„t|ƒD ƒƒ}t‡ fdd„t|ƒD ƒƒ}||ksˆt‚qˆ‡ fdd„dD ƒ}	t|	dƒD ]\}
}|
|| ksît‚qîdS )z#Test making a 10/20 selection dict.ZEEGLABztest_raw.setztest_chans.locsT©r,   Za_stringéd   r2   r3   c                    s$   g | ]\}}ˆ j |  d ¡r|‘qS )ÚF©r9   Ú
startswith©r›   ÚiirD   ©rE   rG   rH   r±   {  s    ÿz'test_1020_selection.<locals>.<listcomp>c                    s$   g | ]\}}ˆ j |  d ¡r|‘qS )ry   r¸   rº   r¼   rG   rH   r±   }  s    ÿc                    s   g | ]}ˆ j  |¡‘qS rG   )r9   Úindexr¯   r¼   rG   rH   r±   ‚  s     )ZFzZC3ZC4)ZMidlineZLeftZRightN)rƒ   r„   Útesting_pathr   r   r	   r‚   Úzipr9   Zset_montager;   r<   r\   r   r]   ÚitemsÚminÚ	enumerateÚmaxr?   )r4   Z	loc_fnameZmontageÚinputZselsrŒ   r}   ÚfsZpsZfz_c3_c4ZchannelZroirG   r¼   rH   Útest_1020_selectionj  s     

rÆ   c                  C   sx  t tdd�} ddddœ}ddd	dœ}dD ]8}t| j|ƒ\}}t| ¡ || ƒ tt|ƒ|| ƒ q(t t	t| jd
¡ t
| jdƒ\}}t| ¡ dƒ | jdd� t| jd
ƒ t tddd¡}t tddd¡}t||d
ƒ} t| jdƒ\}}d|ksòt‚t tdd¡}	t|	ƒ} t| jdƒ\}}d|k�s&t‚t t	t| jd¡ ttƒ}
t|
jdƒ\}}|jjdk�sbt‚|d dk�stt‚d
S )z$Test computing the adjacency matrix.Trµ   i<  i¤  i€  )ÚmagÚgradrc   r~   éÌ   é<   NrÈ   ix
  rÇ   )r­   ZBTiZerm_HFHzc,rfDCÚconfigÚA1ZCTFztestdata_ctf_short.dsZMLC11rb   i1  r   zMEG 001)r   r4   r   r]   r   Úgetnnzr8   r;   r<   rA   r   r   rƒ   r„   r¾   r   r?   r   r   Úfname_kit_157r*   Úsize)rE   ÚsizesZnchansZch_typeÚconnr9   Z	bti_fnameZbti_config_namerŸ   Z	ctf_fnameZraw_kitZneighbrG   rG   rH   Útest_find_ch_adjacency‡  s4    rÒ   c                  C   s\   t  tdd¡} t| dd�}t|jdƒ\}}| ¡ dks:t‚t|ƒdksJt‚|j	dksXt‚d	S )
z8Test computing the adjacency matrix of Neuromag122-Data.rn   zneuromag122_test_file-raw.fifTrµ   rÈ   i  éz   )rÓ   rÓ   N)
rƒ   r„   r¾   r   r   r]   rÍ   r?   r8   r…   )Znm122_fnamerE   rÑ   r9   rG   rG   rH   Útest_neuromag122_adjacency¯  s    ÿrÔ   c                  C   s`   t tdd� dd¡} |  dg¡ |  d¡ |  ddh¡ t t| jdd	g¡ t t| jd	¡ d
S )z7Test if dropping channels works with various arguments.Trµ   r   r.   úMEG 0111úMEG 0112zMEG 0132zMEG 0133é   N)r   r4   r5   r@   r;   r<   rA   r¼   rG   rG   rH   Útest_drop_channels»  s    
rØ   c               	   C   s¼   t tdd� dd¡} |  dddg¡ t| jƒdks6t‚tjt	d	d
��* |  ddddg¡ t| jƒdksjt‚W 5 Q R X t| jƒ}|  dg¡ t| jƒ|ksœt‚|  d¡ t| jƒ|ks¸t‚dS )z6Test if picking channels works with various arguments.Trµ   r   r.   úMEG 0113rÖ   rÕ   r{   znot present in the infor/   r­   r†   N)
r   r4   r5   rD   r8   r9   r?   r;   ro   rp   )rE   Z	names_lenrG   rG   rH   Útest_pick_channelsÅ  s    

rÚ   c                  C   sè   t tdd�} t| jƒ}t| ttƒƒ}| ¡  |jj	d }| 
¡ }t|jƒ}|  dg¡ t| jƒ|d kslt‚t |  ¡ d dk¡s†t‚| dg¡ |jj	d |d ksªt‚| dg¡ t|jƒ|d ksÌt‚t |jd dk¡sät‚dS )zCTest if there is a new reference channel that consist of all zeros.Trµ   r2   zREF 123r1   r   N)r   r4   r8   r9   r$   r#   Ú	eve_fnamer:   Ú_datar…   ÚaverageZadd_reference_channelsr?   r6   r†   Úget_data)rE   Zn_raw_original_channelsÚepochsZepochs_original_shapeÚevokedZn_evoked_original_channelsrG   rG   rH   Útest_add_reference_channelsÙ  s    

rá   c                  C   sÊ  t jttddgdd� tdgdgdgdggtd	d
ddgdd�ƒ} tdgdgdgggtdd
d	gdd�ƒ}ttd
d	dgddd�ƒ}d	g|d< tdgdggtd	d
gdd�ƒ}t| |||gdd�\}}}}|j	d	d
gksÔt
‚t| ¡ dgdggƒ |j	d	d
gksüt
‚t| ¡ dgdgggƒ |j	d	d
gk�s(t
‚|d |d k�s>t
‚|j	|j	k�sPt
‚t|j|jƒ | |k	�slt
‚||k	�szt
‚||k	�sˆt
‚||k�s–t
‚t| |gdd�\}}| |k�s¸t
‚||k�sÆt
‚dS )z,Test equalizing channels and their ordering.ÚfooÚbarz/Instances to be modified must be an instance ofr/   rL   g       @g      @g      @ZCH1ZCH2ZCH3ZCH4)ÚsfreqZCH5ZCH8rc   )rä   rs   rO   T)r>   FN)r;   r<   r\   r   r   r"   r   r!   r    r9   r?   r   rÞ   r*   )rE   rß   ZcovZaverq   Zepochs2Zcov2Zave2rG   rG   rH   Útest_equalize_channelsò  s@    ÿÿÿÿ
ÿrå   c               	   C   s€  t tdd�} t tdd�}ddg|jd< t| ttƒƒ}| ¡ }tdddd	gd
dgd�}t| |ƒ t||ƒ}t	|j
|j
ƒ |j|jks†t‚t||ƒ}|j|jks t‚t| |dd� t||dd� t| |dd�}t|ƒtt| jddd�ƒ }|jd |ksøt‚tdddd	gd�}	t| |	dd�}
t| |	dd�}t| |	dd�}tj|  ¡ |	d  dd�}tj|  ¡ |	d  dd�}tj|  ¡ |	d  dd�}t	|
 ¡ tj|dd�ƒ t	| ¡ tj|dd�ƒ t	| ¡ tj|dd�ƒ tddgd
dgd�}tddgd
dgd�}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jtdd�� t| |dd� W 5 Q R X tjtd d�� t| |ƒ W 5 Q R X tjtd!d�� t| |ƒ W 5 Q R X t tdd�}|jddd� td"d"gd
dgd�}td"gd
dgd�}tdd	gd
dgd�}tjtd#d�� t||dd� W 5 Q R X tjtd$d��(}t| |ƒ t| |ƒ t||dd� W 5 Q R X t|ƒdk�s|t‚d%S )&z4Test channel combination on Raw, Epochs, and Evoked.Trµ   rÙ   rÖ   rO   r   r2   r{   r   r×   r3   ©râ   rã   )Zdrop_bad)Z	keep_stimF)r­   ZstimZnchan)râ   Úmean)ÚmethodÚmedianÚstdrâ   )Zaxisix  z"method" must be a callable, orr/   Z
bad_methodz "keep_stim" must be of type boolZbad_typez"drop_bad" must be of type boolzSome channel indices are out ofzCannot combine sensors of diffrS   zCould not find stimuluszLess than 2 channelsN)r   r4   r]   r$   r#   rÛ   rÝ   r‚   r   r   ÚeventsZbaseliner?   r8   r   r6   rç   rÞ   ré   rê   Zexpand_dimsr;   r<   rA   r\   ro   rp   )rE   Z
raw_ch_badrß   rà   ÚgoodÚcombined_epochsZcombined_evokedZcombine_stimZtarget_nchanZgood_singleZcombined_meanZcombined_medianZcombined_stdZfoo_meanZ
foo_medianZfoo_stdZbad1Zbad2Zraw_no_stimZwarn1Zwarn2Zwarn3ÚrecordrG   rG   rH   Útest_combine_channels  sr    


ÿÿÿ

rï   c                  C   sˆ   ddl } ttdd�}t|ttƒdd�}|  t t	|ƒ¡t 
t	|ƒ¡dœ¡}||_tddddgd	d
gd�}t||ƒ}| j |j|j¡ dS )z:Test if metadata is correctly retained in combined object.r   NTrµ   )ÚAÚBr2   r{   r   r×   r3   ræ   )Zpandasr   r4   r$   r#   rÛ   Z	DataFramer6   Zaranger8   ZonesÚmetadatar‚   r   r%   Zassert_frame_equal)ÚpdrE   rß   rò   rì   rí   rG   rG   rH   Útest_combine_channels_metadatac  s    ÿ
rô   )ZÚos.pathr’   rƒ   Úpathlibr   r>   r   Ú	functoolsr   r¥   r;   Únumpyr6   Zscipy.ior   Znumpy.testingr   r   r   Zmne.channelsr	   r
   r   r   r   r   r   r   Zmne.channels.channelsr   r   r   r   Zmne.ior   r   r   r   r   r   r   Zmne.io.constantsr   Zmner   r   r   r    r!   r"   r#   r$   Zmne.datasetsr%   Z	mne.utilsr&   r'   Zmne.parallelr(   r„   Údirnamer¢   Zio_dirÚbase_dirr4   rÛ   rÎ   Z	data_pathr¾   ÚmarkZparametrizerI   ra   rt   rw   r�   r    Zslowtestr¬   r´   Zrequires_testing_datarÆ   rÒ   rÔ   rØ   rÚ   rá   rå   rï   rô   rG   rG   rG   rH   Ú<module>   s^   ($( .AS

'

-D