U
    f»{j{O  ã                   @   s‚  d dl Zd dlZd dlmZ d dlmZmZ d dlmZ	 d dl
Z
d dlmZ d dlZd dlmZ d dlmZ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 d d	lm Z m!Z! e	 "e	 #e$¡d
d
ddd¡Z%e	 "e%d¡Z&e	 "e%d¡Z'dd„ Z(dd„ Z)dd„ Z*dd„ Z+dd„ Z,dd„ Z-dd„ Z.edƒdd „ ƒZ/d!d"„ Z0d#d$„ Z1d%d&„ Z2d'd(„ Z3d)d*„ Z4d+d,„ Z5d-d.„ Z6d/d0„ Z7d1d2„ Z8d3d4„ Z9dS )5é    N)Úraises)Úassert_array_equalÚassert_allclose)Úpath)Úproduct)Úequalize_channels)Úsum_squaredÚrequires_version)Úcsd_fourierÚcsd_multitaperÚ
csd_morletÚcsd_array_fourierÚcsd_array_multitaperÚcsd_array_morletÚ
tfr_morletÚCrossSpectralDensityÚread_csdÚpick_channels_csdÚpsd_multitaper)Ú_sym_mat_to_vectorÚ_vector_to_sym_matz..ÚioZtestsÚdataztest_raw.fifztest-eve.fifc                  C   sP   ddddg} t | ƒ}dddg}d\}}t d	| ¡ |d
¡j}t||| d||ƒS )z*Make a simple CrossSpectralDensity object.ç      ð?g       @g      @g      @ÚCH1ÚCH2ÚCH3)g        r   g      @é   é   )ÚlenÚnpÚarangeZreshapeÚTr   )ÚfrequenciesÚn_freqsÚnamesÚtminÚtmaxr   © r(   ú`/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/time_frequency/tests/test_csd.pyÚ	_make_csd   s    
r*   c               
   C   sÚ   t dddgddgddddd�} t| jdgdgdggƒ t| jdgƒ ttt dddgdddgddddd	� ttt dddgd
gddddd	� ttt ddgddgddggddgddddd	� ttt dgggdgddddd� dS )z)Test constructing a CrossSpectralDensity.r   é   é   r   r   r   )r#   Ún_fftr&   r'   z	Too many!)r&   r'   r#   r-   z
too littleé   é   r   N)r   r   Ú_datar#   r   Ú
ValueError©Úcsdr(   r(   r)   Útest_csd#   sB      ÿ    ÿ   ÿ    þ  ÿr4   c                  C   sž   t ƒ } t| ƒdkst‚t|  ¡ ƒdks*t‚| jddgddgd�}t|ƒdksPt‚| jddgddgd�}t|ƒd	ksvt‚|  ¡ }d
|_d
|_t|ƒdksšt‚d
S )z3Test string representation of CrossSpectralDensity.z\<CrossSpectralDensity | n_channels=3, time=0.0 to 1.0 s, frequencies=1.0, 2.0, 3.0, 4.0 Hz.>zQ<CrossSpectralDensity | n_channels=3, time=0.0 to 1.0 s, frequencies=1.0-4.0 Hz.>r   r,   r+   r.   ©ÚfminÚfmaxzZ<CrossSpectralDensity | n_channels=3, time=0.0 to 1.0 s, frequencies=1.0-2.0, 3.0-4.0 Hz.>zV<CrossSpectralDensity | n_channels=3, time=0.0 to 1.0 s, frequencies=1.0, 2.0-4.0 Hz.>NzW<CrossSpectralDensity | n_channels=3, time=unknown, frequencies=1.0, 2.0, 3.0, 4.0 Hz.>)r*   ÚstrÚAssertionErrorÚmeanÚcopyr&   r'   )r3   Ú
csd_binnedZcsd_no_timer(   r(   r)   Útest_csd_repr:   s    ÿr=   c               	   C   sÎ  t ƒ } dgdgdgdgdgdgg}t|  ¡ j|ƒ t| jddd	�j|ƒ t| jd
dd	�j|ƒ t| jddd	�j|ƒ t| jd
dd	�j|ƒ | jd
dgddgd	�}t|jddgddgddgddgddgddggƒ | jd
dgd
dgd	�}t|jddgd
dgddgddgddgddggƒ |  ¡ j�s&t‚|  ¡ jd
dddggk�sDt‚| jd
dgddgd	�jd
dgddggk�srt‚tt| jd
ddgd	� tt| jd
dgdgd	� tt| jd
dgd
d
gd	� tt	|  ¡ jƒ dS )z6Test averaging frequency bins of CrossSpectralDensity.é	   é
   é   é   é   é   Nr.   r5   r   r   r,   r+   é   é   r/   é   r   é   é   é   é   é   )
r*   r   r:   r0   Ú_is_sumr9   r#   r   r1   ÚRuntimeError)r3   Úavgr<   r(   r(   r)   Útest_csd_meanV   sL    ûþ
ûþÿ
rO   c                  C   sŽ   t ƒ } |  d¡dkst‚|  d¡dks*t‚|  d¡dks<t‚|  d¡dksNt‚|  d¡dks`t‚|  d¡dksrt‚tt| j| jd	 d
 ƒ dS )z=Test the _get_frequency_index method of CrossSpectralDensity.r   r   r+   r.   r,   gÍÌÌÌÌÌì?gÍÌÌÌÌÌ @gffffff@éÿÿÿÿgq¬‹Ûh ð?N)r*   Z_get_frequency_indexr9   r   Ú
IndexErrorr#   r2   r(   r(   r)   Útest_csd_get_frequency_indexŠ   s    rR   c                  C   sÊ   t ƒ } | jdd�}|jdgks"t‚t| ¡ dddgdddgdddggƒ | jd	d
�}|jdgksdt‚t| ¡ dddgdddgdddggƒ tt| jdƒ tt| jdd
� tt| jƒ tt| jdd	d� dS )z7Test the pick_frequency method of CrossSpectralDensity.r+   )Úfreqr   rH   rJ   r>   r?   r@   r   ©ÚindexrP   )rS   rU   N)	r*   Zpick_frequencyr#   r9   r   Úget_datar   rQ   r1   )r3   Úcsd2r(   r(   r)   Útest_csd_pick_frequencyš   s.    þþþþrX   c                  C   sð   t ƒ } t| jdd�dddgdddgdddggƒ t|  ¡  ¡ dddgdd	d
gdd
dggƒ t| jddgddgd�jdd�dddgdddgdddggƒ tt| jƒ tt| jddd� tt| jdd� tt|  ¡ jdd� tt|  ¡ jdd� dS )z1Test the get_data method of CrossSpectralDensity.r+   )Ú	frequencyr   rH   rJ   r>   r?   r@   rA   rB   rC   r   r,   r.   r5   rT   rD   rE   rF   rG   rI   rK   )rY   rU   N)r*   r   rV   r:   r   r1   rQ   r2   r(   r(   r)   Útest_csd_get_data»   s6    
þþ
þþþþrZ   Zh5ioc                 C   sŽ   t ƒ }t| ƒ}t |d¡}| |¡ t|ƒ}t|j|jƒ |j|jksJt	‚|j
|j
ksZt	‚|j|jksjt	‚|j|jkszt	‚|j|jksŠt	‚dS )z/Test saving and loading a CrossSpectralDensity.zcsd.h5N)r*   r8   ÚopÚjoinÚsaver   r   r0   r&   r9   r'   Úch_namesr#   rL   )Útmp_pathr3   ÚtempdirÚfnamerW   r(   r(   r)   Útest_csd_saveß   s    
rb   c              	   C   s¾   t ƒ }t| ƒ}t |d¡}t|dƒ�}t ||¡ W 5 Q R X t|dƒ�}t |¡}W 5 Q R X t|j	|j	ƒ |j
|j
kszt‚|j|jksŠt‚|j|jksšt‚|j|jksªt‚|j|jksºt‚dS )z4Test pickling and unpickling a CrossSpectralDensity.zcsd.datÚwbÚrbN)r*   r8   r[   r\   ÚopenÚpickleÚdumpÚloadr   r0   r&   r9   r'   r^   r#   rL   )r_   r3   r`   ra   ÚfrW   r(   r(   r)   Útest_csd_pickleï   s    rj   c                  C   sT   t ƒ } t| ddgƒ} | jddgks&t‚t| jddddgddd	d
gddddggƒ dS )z4Test selecting channels from a CrossSpectralDensity.r   r   r   r   rA   rG   r+   rJ   rC   rK   r/   r@   rF   é   N)r*   r   r^   r9   r   r0   r2   r(   r(   r)   Útest_pick_channels_csd   s    

þrl   c                  C   s4  t  ddddgddddgdddd	gddd	d
gg¡} tt| ƒddddddddd	d
g
ƒ t  d¡}tt|ƒddddgddddgdddd	gddd	d
ggƒ t  d¡d }tt|ƒddgddggƒ t|  t j¡ƒjt jksØt	‚t| t j¡ƒjt jksôt	‚t|  t j
¡ƒjt j
k�st	‚t| t j
¡ƒjt j
k�s0t	‚dS )z7Test converting between vectors and symmetric matrices.r   r   r+   r,   r.   r/   r   rH   rJ   r>   r?   y              ð?y                y      ð?      ð?y      ð?      ð¿y       @        N)r    Úarrayr   r   r!   r   ZastypeZint8Zdtyper9   Zfloat16)ZmatZvecZcomp_vecr(   r(   r)   Útest_sym_mat_to_vector
  s4    


ýÿ




ýÿÿÿrn   c            	         sú   dddg} d}t  | |d¡}d| }td| ƒ}t |¡| ‰ t dd	d	gg¡}t |d
 ¡d tj }t ‡ fdd„|D ƒ¡}t d	|d
 |f¡}||ddd…dd…f< t 	ˆ d tj d ¡}|dddgdd…f  |7  < t j
|||dˆ d fd�S )aJ  Create an epochs object with coherence at 22Hz between channels 1 and 3.

    A base 10 Hz sine wave is generated for all channels, but with different
    phases, which means no actual coherence. A  22Hz sine wave is laid on top
    for channels 1 and 3, with the same phase, so there is coherence between
    these channels.
    r   r   r   g      I@Zeegr   r?   r   r   Znchang333333Ó?c                    s(   g | ] }t  ˆ d  t j d | ¡‘qS )r+   r?   )r    ÚsinÚpi)Ú.0Zphase©Útimesr(   r)   Ú
<listcomp>;  s   ÿz,_generate_coherence_data.<locals>.<listcomp>Nr+   é   rP   )Úbaseline)ÚmneZcreate_infoÚintr    r!   rm   rp   ZvstackZzerosro   ZEpochsArray)	r^   ÚsfreqÚinfoZtstepÚ	n_samplesÚeventsZphasesÚsignalr   r(   rr   r)   Ú_generate_coherence_data'  s     
ÿr~   c                 C   sÀ  t | jƒ}|dkst‚| jdddgks*t‚t | jƒ}|dks@t‚| jjdksPt‚| jdd�}| jdd�}t |¡}t |¡}t 	t 
|¡j ¡ t |¡k¡s t‚t 	t 
|¡j ¡ t |¡k¡sÄt‚t |d	 j¡d
ksÜt‚t |d j¡d
ksôt‚t |d j¡d
k�st‚t 	t |d j¡dk ¡�s.t‚t |d ¡t |d	 ¡k�sPt‚t |d ¡t |d ¡k�srt‚t | jdd�¡}t 	||k¡�s˜t‚t 	|ddg |ddg k¡�s¼t‚dS )z)Perform a suite of tests on a CSD matrix.r,   r   r   r   )r   r,   r   rT   r+   )r   r   gš™™™™™Ù?)r   r+   )r   r+   çü©ñÒMbP?r   rP   N)r   r^   r9   r#   r0   ÚshaperV   r    ÚdiagÚallZtrilr"   ZconjZtriuÚabsÚimag)r3   Zn_chanr$   Zcsd_10Zcsd_22Zpower_10Zpower_22Zpower_15r(   r(   r)   Ú_test_csd_matrixI  s*    



$$ ""r…   c              	   C   sd  t t|| ddd� t t|| j| jd | jddd� t t|| ddd� t t|| j| jd | jddd� t t|| ddd� t t|| j| jd | jddd� t t|| d	dd� t t|| j| jd | jd	dd� t t|| dd
d� t t|| j| jd | jdd
d� tj dd¡dg}tj dd¡tj dd¡g}t t||dd� t t||dd� t t|tj d¡dd� dS )z7Parameter tests for csd_*_fourier and csd_*_multitaper.rK   r?   r5   ry   gš™™™™4@g333333Ã?gš™™™™™¹?)r&   r'   rP   r@   r,   r/   Úerrorr+   r.   r   )ry   N)r   r1   r0   rz   r&   r    ÚrandomZrandn)ÚepochsZ
csd_epochsZ	csd_arrayZ
diff_typesZerr_datar(   r(   r)   Ú#_test_fourier_multitaper_parametersq  sF      ÿ  ÿ  ÿ  ÿ  ÿr‰   c                  C   s¦  t ƒ } | jd }t| ttƒ ddg}ddg}t||ƒ}|D ]¦\\}}}|rlt|  ¡ || jdd||| jd�}nt| dd||d	�}|d
kr¨|d
kr¨|jdkr¢|j	dksÀt
‚n|j|kr¼|j	|ksÀt
‚| dddgdddg¡}t|ƒ q:t d| ¡| }t dtj d | ¡d
d
d
d
…f }	t|	ƒt|ƒ }
dD ]r}||k}t|ƒ}dD ]V}|| }t|	|||d� ¡  ¡ }|d }t |¡| | }t|
| ƒdk �sFt
‚�qF�q.d
S )z?Test computing cross-spectral density using short-term Fourier.ry   ©NN©r   r>   FTr>   rk   )r6   r7   r&   r'   r^   )r6   r7   r&   r'   Nr   çö(\�Âõ#@çÍÌÌÌÌÌ#@çÍÌÌÌÌÌ-@çfffffæ5@ç333333$@ç333333.@çš™™™™6@rK   r+   r?   ©rA   rG   )r   é   )r'   r-   ©r   r   r   )r~   rz   r‰   r
   r   r   rV   r&   r^   r'   r9   r:   r…   r    r!   ro   rp   r   r   Úsumrƒ   )rˆ   ry   rs   Ú	as_arraysÚ
parametersr&   r'   Úas_arrayr3   r}   Úsignal_power_per_sampleÚt_maskr{   Z	add_n_fftr-   Z
first_sampZfourier_power_per_sampler(   r(   r)   Útest_csd_fourier‹  sN    

   þ
&ÿÿÿrœ   c                     s  t ƒ } | jd }t| ttƒ ddg}ddg}ddg}t|||ƒ}|D ]¬\\}}}}	|rzt|  ¡ || j|	dd||| jd�	‰ nt| |	dd||d	�‰ |d
kr¸|d
kr¸ˆ jdkr²ˆ j	dksÐt
‚nˆ j|krÌˆ j	|ksÐt
‚ˆ  dddgdddg¡‰ tˆ ƒ qDt| ddd�\}
}t| ƒ‰ t|ˆ jƒ t ‡ fdd„ttˆ ƒƒD ƒ¡j‰ t|
d ˆ ƒ t d| ¡| }t dtj d | ¡d
d
d
d
…f }t|ƒt|ƒ }dD ]„}||k}t|ƒ}t|ƒ}dD ]`}|t|ƒ |d  }t|||||d� ¡  ¡ }t |d ¡| | }t|| ƒdk �s´t
‚�q´�q”d
S ) z8Test computing cross-spectral density using multitapers.ry   rŠ   r‹   FTr>   rk   )Úadaptiver6   r7   r&   r'   r^   )r�   r6   r7   r&   r'   Nr   rŒ   r�   rŽ   r�   r�   r‘   r’   r   Úfull)r6   Znormalizationc                    s   g | ]}t  ˆ j|d �¡‘qS )rT   )r    r�   rV   )rq   Úiir2   r(   r)   rt   Ú  s   ÿz'test_csd_multitaper.<locals>.<listcomp>rK   r+   r?   r“   )r   r+   r/   r   )r'   Ú	bandwidthr-   r•   )r~   rz   r‰   r   r   r   rV   r&   r^   r'   r9   r:   r…   r   r   r#   r    rm   Úranger   r"   r!   ro   rp   r   r–   Úfloatrƒ   )rˆ   ry   rs   r—   Z	adaptivesr˜   r&   r'   r™   r�   ZpsdZ	psd_freqsr}   rš   r›   r{   r-   Zn_tapersr    Zcsd_mtZmt_power_per_sampler(   r2   r)   Útest_csd_multitaper¹  sh    
ÿ   ý
 ÿ
ÿ

ÿ
&þr£   c                  C   sž  t ƒ } | jd }dddg}dddg}dd	g}d
dg}t||ƒ}|D ]Ž\\}}}	|	rtt|  ¡ ||| j|||| jd�}
nt| ||||d�}
|dkr°|dkr°|
jdkrª|
jdksÈt	‚n|
j|krÄ|
j|ksÈt	‚t
|
ƒ qBt| ||d
d�}t |jd¡}t| ||d�}
t|
jdddg | |ƒ t| ||d
d�}
t|
jdddg | |ƒ |  ¡ }d|_|j ¡ � d|j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 computing cross-spectral density using Morlet wavelets.ry   r?   rD   ru   rK   r”   é,   rŠ   r‹   FT)Út0Ún_cyclesr&   r'   r^   )r#   r¦   r&   r'   Nr   rŒ   )Z
return_itcr+   )r#   r¦   r,   r/   )r#   r¦   Zuse_fftZhighpassrv   )Úmatch)r#   Zdecim)r~   rz   r   r   rV   r&   r^   r   r'   r9   r…   r   r    r:   r   r   r0   r;   rv   Z_unlockÚpytestZwarnsÚRuntimeWarning)rˆ   ry   Zfreqsr¦   rs   r—   r˜   r&   r'   r™   r3   ZtfrÚpowerZepochs_nobaser(   r(   r)   Útest_csd_morletó  sL    



  ý ÿ
ÿr«   c                  C   sT   t ƒ } |  ¡ jddgdd�}t| |gƒ\} }| jddgks>t‚|jddgksPt‚dS )zDTest equalization of channels for instances of CrossSpectralDensity.r   r   T)ÚorderedN)r*   r;   Zpick_channelsr   r^   r9   )Zcsd1rW   r(   r(   r)   Útest_equalize_channels!  s
    r­   ):Únumpyr    r¨   r   Znumpy.testingr   r   Úosr   r[   rf   Ú	itertoolsr   rw   Zmne.channelsr   Z	mne.utilsr   r	   Zmne.time_frequencyr
   r   r   r   r   r   r   r   r   r   r   Zmne.time_frequency.csdr   r   r\   ÚdirnameÚ__file__Úbase_dirZ	raw_fnameZevent_fnamer*   r4   r=   rO   rR   rX   rZ   rb   rj   rl   rn   r~   r…   r‰   rœ   r£   r«   r­   r(   r(   r(   r)   Ú<module>   sB   4
4!$

"(.:.