U
    f»{jÓQ  ã                   @   sP  d dl Z d dlmZmZ d dlZd dlmZ d dlZd dlZd dlm	Z	 d dl
mZmZ d dlZd dlZd dlZd dlmZmZmZmZmZ d dlmZ d dlmZmZmZ d d	lmZ d d
lmZ d dlmZ d dl m!Z! d dl"m#Z# d dl$m%Z%m&Z&m'Z'm(Z( d dl)m*Z*m+Z+m,Z, d dl-m.Z. e*j/dd�d Z0dZ1dZ2dZ3dZ4dZ5dZ6e 7e,j8j/dd�ddd¡Z9e+j/dd�Z:e1de2de3de4de5d e6d!iZ;e1e2fZ<e=e>e; ?¡ ƒƒZ@ejAjBe*jCd"d#„ ƒƒZDe*jCd$d%„ ƒZEe+jFd&d'„ ƒZGe*jCejA Hd(d d)g¡d*d+„ ƒƒZIe,j8jJd,d-„ ƒZKe*jCd.d/„ ƒZLd0d1„ ZMd2d3„ ZNe*jCd4d5„ ƒZOe*jCd6d7„ ƒZPe*jCd8d9„ ƒZQdS ):é    N)ÚdatetimeÚtimezone)Úpath)Úarray_equal)Úassert_allcloseÚassert_array_equal)Ú
pick_typesÚread_annotationsÚcreate_infoÚevents_from_annotationsÚmake_forward_solution)Úapply_trans)Úread_raw_fifÚread_raw_ctfÚRawArray)Úget_current_comp)ÚCTF©Ú_convert_time)Ú_test_raw_reader)Ú_assert_annotations_equal)Ú_clean_namesÚcatch_loggingÚ_stamp_to_dtÚ_record_warnings)ÚtestingÚspm_faceÚ
brainstorm)ÚFIFFF)Údownloadr   ztestdata_ctf.dsútestdata_ctf_short.dsz testdata_ctf_pseudocontinuous.dsz#testdata_ctf_short_discontinuous.dszsomMDYO-18av.dsúcatch-alp-good-f.dsÚMEGÚbst_rawz*subj001_somatosensory_20111109_01_AUX-f.dsià.  iÁ  i±  i9  iÄ	  c                    s	  t | ƒ}t |d¡}t t |d¡¡ t |dt¡}t t tt¡|¡ t	j
tdd�� tt|d�‰ W 5 Q R X tˆ jddd�}tj d	¡ t|ƒd
¡}t |d¡}t|dƒ�}| d d¡¡ W 5 Q R X t	 tt|¡ t|dƒ�b}t|ƒD ]R\}}	t |	d ƒˆ j|	 ftdd„ d||  D ƒƒ }
| d |
¡d  d¡¡ qêW 5 Q R X t ‡ fdd„|D ƒ¡}t	j
tdd�� t|ƒ‰ W 5 Q R X t ‡ fdd„|D ƒ¡}ttˆ jd |ƒ|ddd� ||k  ¡ dk �sÌt!‚t "t td¡t |dd¡¡ t t |d¡¡ t |dt¡}t ||¡ t |t #td d!… ¡¡}t $|d" ¡ t	j
td#d�� t	 tt|¡ W 5 Q R X t $|d$ ¡ t "t td%¡t |dd¡¡ d&d„ t%D ƒ}|D �]æ}t&|d' dd(�}t'ƒ � t|ƒ‰ W 5 Q R X t(ˆ j|jƒ tˆ j)|j)ƒ tˆ j*|j*ƒ ˆ jd) d* |jd) d* d k�s$t!‚d+D ]*}tˆ j| d, |j| d, d-d.d� �q(d/D ]$}ˆ j| |j| k�sXt!|ƒ‚�qXt #|¡t+k�r ˆ j,|j,k�s t!‚tˆ jd0 ƒt|jd0 ƒk�sÂt!‚t-ˆ jd0 |jd0 ƒD ]„\}}d1D ]}t|| || ƒ �qä|d2 |d2 k�st!‚d3D ] }t(|d4 | |d4 | ƒ �qt|d4 d4 |d4 d4 d.dd5� �qØtˆ jd6 d7 d8 d, |jd6 d7 d8 d, dd.d� tˆ jd9 ƒt|jd9 ƒk�s´t!‚tt-ˆ jd9 |jd9 ƒƒD �]ž\}\}}d:D ]x}|d; d<k�r
d=|k�r
|d>k�r
�qà|d?k�r<|| t.j/k�r<|| t.j0k�sàt!‚�qà|| || k�sàt!|ƒ‚�qàd@D ](}t|| || dAd-dB||f dC� �q^dDD ]Þ}|d; d<k�r¬d=|k�r¬�qŒ|| d d
… dEk 1¡ �rÔtj2gd
 }n|| d d
… }t|| d d
… |dAd-dB||f dC� || d
d … dEk 1¡ �r2tj2gd
 }n|| dFdG… }t|| dFdG… |dAd-dB||f dC� �qŒ�qÎˆ jdH D ]}|dI t.j3k�szt!dJƒ‚�qz| 4dK¡�rÔˆ j 5¡ � ˆ jdH d dL… ˆ jdH< W 5 Q R X |j6|ddMdN� t&|ƒ}tj d7¡}| 7t 8tˆ jƒ¡¡d dO… }t9t:ˆ jdP ˆ j, ƒƒ}|ˆ j;d7 dQ k�sFt!‚|t<t #|¡ k�s^t!‚t=d7|ƒt=|d |ƒt=d
|ƒt=d
dRƒt=d ƒf}tˆ j)ƒdS| k�rÌ|t=|dS| ƒt=||d ƒt=d7|d ƒf }|D ]J}tˆ ||f d7 |||f d7 ƒ t|||f d7 |||f d7 ƒ �qÐˆ  >¡  tˆ d d … d7 |d d … d7 dTdU� dV|k�r¤dWˆ j?j@d7 k�sjt!‚tˆ j?jAdXgƒ tˆ j?jBdYgƒ �q¤t	jtCdZd�� tdƒ W 5 Q R X t	jtDd[d�� ttEd\ ƒ W 5 Q R X tt ttE¡d]ƒ t	jtFd^d�� tt ttE¡d_ƒ W 5 Q R X d S )`zTest CTF reader.útest_py_raw.fifZrandposzRMSP .* changed to a MISC ch©Úmatch)Ú	directoryFT)ÚmegZeegé*   é   zcatch-alp-good-f.eegÚwbzfoo
Úasciié   c                 s   s   | ]}d | V  qdS )z%0.5fN© )Ú.0Úxr.   r.   úX/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/io/ctf/tests/test_ctf.pyÚ	<genexpr>T   s    z test_read_ctf.<locals>.<genexpr>éd   ú	Ú
c                    s&   g | ]}ˆ j d  | d dd… ‘qS ©ÚchsÚlocNr*   ©Úinfo©r/   Úp©Úrawr.   r1   Ú
<listcomp>W   s     z!test_read_ctf.<locals>.<listcomp>c                    s&   g | ]}ˆ j d  | d dd… ‘qS r6   r9   r;   r=   r.   r1   r?   Z   s     Ú
ctf_head_tgñhãˆµøä>©ÚrtolÚatolgš™™™™™¹?z#catch-alp-good-f.ds_randpos_raw.fifzcatch-alp-good-f.ds_raw.fifZnohcZno_hcNéýÿÿÿz.hczMISC channelz.eegz catch-alp-good-f.ds_nohc_raw.fifc                 S   s   g | ]}t  t|¡‘qS r.   )ÚopÚjoinÚctf_dir)r/   Úcr.   r.   r1   r?   n   s     z_raw.fif©ZpreloadZmeas_idÚversion)Z
dev_head_tZ	dev_ctf_tr@   Ztransg-Cëâ6?gH¯¼šò×z>)Zacq_parsZacq_stimZbadsÚch_namesZcustom_ref_appliedÚdescriptionÚeventsZexperimenterZhighpassZ	line_freqZlowpassZnchanZproj_idZ	proj_nameZprojsÚsfreqZsubject_infoÚcomps)ZcolcalsZrowcalsZsave_calibrated)Ú	row_namesÚ	col_namesZnrowZncolÚdata)rC   rB   Zhpi_resultsr   Zcoord_transr7   )	ÚkindZscannoÚunitÚch_nameZunit_mulÚrangeÚcoord_frameÚ	coil_typeÚlognorU   ZRMSPzcatch-alp-good-f)rS   rT   rW   rX   rY   rX   )Úcalç�íµ ÷Æ°>zraw.info["chs"][%d][%s])rC   rB   Úerr_msg)r8   ç        é	   é   ÚdigrW   z+dig points must be in FIFF.FIFFV_COORD_HEADr!   iöÿÿÿg      ð?)Ú	overwriteÚbuffer_size_secé
   rN   Ú
block_sizei,  é   gVçž¯Ò<©rC   r    Úbadg333333@g
×£p=
—?z	path-likezdoes not existzfoo.dsÚignoreZsystem_clockZfoo)GÚstrrE   rF   ÚosÚmkdirÚctf_fname_catchÚshutilÚcopytreerG   ÚpytestÚwarnsÚRuntimeWarningr   r   r   r:   ÚnpÚrandomZRandomStateZrandnÚlenÚopenÚwriteÚencodeÚraisesÚRuntimeErrorÚ	enumeraterK   ÚtupleÚarrayr   r   ZmeanÚAssertionErrorÚcopyÚbasenameÚremoveÚ
ctf_fnamesr   r   r   ÚtimesZ_calsÚsingle_trialsrb   Úzipr   ZFIFFV_COIL_EEGZFIFFV_COIL_NONEÚallÚnanÚFIFFV_COORD_HEADÚendswithZ_unlockÚsaveZpermutationZarangeÚintÚroundÚ_raw_extrasÚblock_sizesÚsliceÚ	load_dataÚannotationsrL   ÚonsetÚdurationÚ	TypeErrorÚFileNotFoundErrorÚctf_fname_continuousÚ
ValueError)Útmp_pathÚtemp_dirÚ	out_fnameZctf_eeg_fnameZpicksÚposZfake_eeg_fnameZfidÚiiZch_numÚargsZpos_read_oldZpos_readZctf_no_hc_fnameZremove_baseZ
use_fnamesÚfnameZraw_cÚtÚkeyÚc1Úc2Úcheckr<   Zraw_readÚrngZpick_chZbndZslicesZsl_timer.   r=   r1   Útest_read_ctf=   s.   
ÿ
& ÿÿÿ
ÿ
 ÿ
""ÿ
 þ"(ÿþ
ÿ

ÿ
ÿÿ" ÿÿÿÿ&
r¤   c            
   	   C   sR  t jtdd��* tt tt¡ƒ} tt tt¡dd�}W 5 Q R X t| j	ƒ}t
 | jd ¡}| j	|ksft‚dd„ | jd D ƒ}||ks†t‚t|| jd ƒD ]4\}}d	D ]&}tt|d
 | ƒ|d
 | ƒr¢t‚q¢q–|j	|ksÚt‚t|jd |ƒD ]\}}	|d |	ksêt‚qêt||jd ƒD ]8\}}d	D ](}t|d
 | ƒ|d
 | k�s t‚�q �qdS )z Test RawCTF _clean_names method.zref channel RMSP did notr%   T)Zclean_namesrO   c                 S   s   g | ]}|d  ‘qS )rU   r.   )r/   Úchr.   r.   r1   r?   ý   s     z+test_rawctf_clean_names.<locals>.<listcomp>r7   )rP   rQ   rR   rU   N)ro   rp   rq   r   rE   rF   rG   rl   r   rK   r~   Údeepcopyr:   r}   r„   r   )
r>   Zraw_cleanedZtest_channel_namesZtest_info_compsZchs_ch_namesZ	test_compÚcomprŸ   r¥   Ztest_ch_namer.   r.   r1   Útest_rawctf_clean_namesï   s*    ÿ

ÿr¨   c                  C   s  t  tddd¡} t| ƒ}|jd }|d |jks4t‚|d |d ksHt‚t dd„ |j	d	 D ƒ¡}t 
|tjk¡svt‚d
d„ |j	d	 D ƒ}|d d |d d   k r¶|d d k s¼n t‚|d d |d d k sØt‚|d d |d d k sôt‚| ¡ D ]}t|| d ddd� qüdS )z%Test CTF reader with omitted samples.r"   Zspmz SPM_CTF_MEG_example_faces1_3D.dsr   Zn_sampZ
n_samp_totc                 S   s   g | ]}|d  ‘qS )rW   r.   ©r/   Údr.   r.   r1   r?     s     z%test_read_spm_ctf.<locals>.<listcomp>r`   c                 S   s   i | ]}|d  |d “qS )ÚidentÚrr.   r©   r.   r.   r1   Ú
<dictcomp>  s      z%test_read_spm_ctf.<locals>.<dictcomp>r-   re   r*   r[   rf   N)rE   rF   Úspm_pathr   rŒ   Zn_timesr}   rr   r|   r:   r…   r   r‡   Úkeysr   )Z	raw_fnamer>   ÚextrasZcoord_framesZ	cardinalsrŸ   r.   r.   r1   Útest_read_spm_ctf  s    
ÿ
2r±   Ú
comp_grader-   c           	   	   C   s²  t | ƒ}t |d¡}tt tt¡ƒ}|jd tdƒks:t‚| 	dd¡ 
¡  |jt|jƒ  krfdksln t‚t|jd ƒdks‚t‚tdd	dd
�}| |¡ tƒ �}| ¡ jf |Ž}W 5 Q R X t|jd ƒdksÒt‚t|jd ƒdksèt‚| ¡ }d|ksüt‚|j|dd� t|ƒ}|j|jk�s$t‚t|j|jƒ t|dd… d |dd… d ddd� t|dd�}|j|jk�sxt‚t|j|jƒ t|dd… d |dd… d ddd� dS )z!Test saving picked CTF instances.r$   Ú	meas_date)i ?~Qr   r   r-   rO   é   TF)r(   Zref_megÚverbosezRemoving 5 compensators)ra   é   r[   g#B’¡œÇ;rA   rI   N)ri   rE   rF   r   rG   Úctf_fname_1_trialr:   r   r}   Úcropr�   Úcompensation_grader   rt   ÚdictÚapply_gradient_compensationr   r~   r   Úgetvaluer‰   r   rK   r   r‚   r   )	r—   r²   r˜   r™   r>   Zpick_kwargsÚlogZraw_pickZraw2r.   r.   r1   Útest_saving_picked&  s8    "
 ÿ ÿr¾   c               Ì   C   s  t  ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd€d�d‚dƒd„d…d†d‡dˆd‰dŠd‹dŒd�dŽd�d�d‘d’d“d”d•d–d—d˜d™dšd›dœd�dždŸd d¡d¢d£d¤d¥d¦d§d¨d©dªd«d¬d­d®d¯d°d±d²d³d´dµd¶d·d¸d¹dºd»d¼d½d¾d¿dÀdÁdÂdÃdÄdÅdÆdÇdÈdÉdÊgÊ¡dË } tt jdÌt jdÍ�tdËdÎdÏ�dÐ�}| ttƒj	dÑ ¡ | 
ttƒ¡ t|ƒ\}}t  |dÒdÒ…dÓf ¡}t|| dÔdÕ� dÒS )ÖzTest reading CTF marker file.i  i  i'  iÝ/  i[7  i­@  iÐI  inQ  i®X  iža  iÎh  i.q  iºx  i5�  i©ˆ  i+�  i
˜  i8Ÿ  i�§  i¦°  ia¹  iÒÁ  iZÊ  iÓÓ  ikÛ  i¢ã  iêë  i§ó  i¼û  iÏ iÛ iÅ i i( iB1 i: izB iJ iƒQ ijY izb iÝj i;r i6z i´‚ i¹‚ iUŠ i�“ ij› iž¤ ic¬ iä´ i¼ iiÄ i»Ë ioÓ inÜ i·ã ižì iêõ iÙý iÈ i$ iú iz iN( i,1 iT9 i±A i½J iÐS i\ iád i×m i¦v iŠ i½ˆ i’ i€š iç¡ iª iö² iv» i�Ä i�Í i²Ö i&à izç i”ð izø iâ  iù	 iK i  iÇ  i1* iý2 i·; iÅC iÅK i¸S i\ i¹c i1l iùs i.} ic… iÍ� iÅ– i=Ÿ ik¨ ib° i$¸ iÀ iùÇ iÇÐ iî× i,á i¹é i2ñ iHú ir iX iA i³ iÄ$ i. iå6 i¤? iØG iCP iY iUa i¨h i}p i?y iÉ� i‹ ij’ iê™ iY¡ iŒ© iª² il» i6Ä i�Ì i�Õ iEÝ iÕå i?í iõ i/ý i} iÀ iÁ i� ià i@( i¯0 i8 i(A iÅH i€Q iúZ ic i›k iIt i³| iý„ iœŒ i§” i·œ iq¤ iÀ¬ i`´ iŒ½ iÆ i€Ï i‹× i‰à iè i:ñ iÈù i9 i= i† iF iö" iˆ* i2 i4; i>D ieM iÿT iR\ iíc iØk i/t iB| iÏ„ iÞŒ i4– r-   )r-   i€— )Zdtypeg     À’@)rK   rN   )rR   r:   r³   Nr   r[   rf   )rr   r|   r   ÚemptyZfloat64r
   Zset_meas_dater   Úsomato_fnamer:   Zset_annotationsr	   r   Úsortr   )ZEXPECTED_LATENCIESr>   rM   Ú_Z	latenciesr.   r.   r1   Útest_read_ctf_annotationsH  s®                                                                                                                                                                                   æå
þrÃ   c               $   C   s†   ddddddddd	d
dddddddddddddddddddddd d!d"d#d$g$} t  td%¡}t|ƒ}t|j| ƒ t|ƒ}t|j|d&ƒ d'S )(z�Test reading CTF marker file.

    `testdata_ctf_mc.ds` has no trials or offsets therefore its a plain reading
    of whatever is in the MarkerFile.mrk.
    r]   g=
×£p=Â?g=
×£p=Ò?gïÀ3ÐiÛ?g#zBDDâ?gbqtÚæ?g§$g8Ðië?g7ç\a,ùï?gHáz®Gò?g�Âõ(\�ô?g×£p=
×ö?gƒ=!""ù?gËò·5Ðiû?gT’3è´ý?g›s®0–üÿ?grª”"""@gHáz®G@gìQ¸…k@gÂˆž‘@gfùÛè´@g	j%¿Ø@gÎ9WKþ@grª”"""	@gÒ,ùE
@gìQ¸…k@g�Âõ(\�@gfùÛè´@g	j%¿Ø@g­ÚV/–ü@g9UJ‘@g‹i–ü"@gÝÅ‡è´@gHáz®G@gš™™™™Ù@gµŒ’_l@gWm«Kþ@ztestdata_ctf_mc.dsr[   N)	rE   rF   rG   r	   r   r‘   r   r   r�   )ZEXPECTED_ONSETr�   Zannotr>   r.   r.   r1   Ú$test_read_ctf_annotations_smoke_tests  sT                                  úrÄ   c                 C   s8   t jjj | ¡}|d D ]}|d tjkrd|d< q|S ©Nr7   Zsensor_type_indexr-   Zgrad_order_no)ÚmneÚioÚctfÚres4Ú
_read_res4r   ZCTFV_REF_MAG_CH©ZdsdirÚresr¥   r.   r.   r1   Ú_read_res4_mag_compŠ  s
    
rÍ   c                 C   s<   t jjj | ¡}|d D ]}|d tjkrd|d<  q8q|S rÅ   )rÆ   rÇ   rÈ   rÉ   rÊ   r   ZCTFV_MEG_CHrË   r.   r.   r1   Ú_bad_res4_grad_comp’  s    rÎ   c              	   C   sd   | t  }t tt  | t  ¡ t|ƒ t |t dd… d  ¡ tjt	dd�� t|ƒ W 5 Q R X dS )z-Test that res4 missing is handled gracefully.NéþÿÿÿZmeg4zcould not find the followingr%   )
r•   rm   rn   rG   r   rj   r€   ro   rx   ÚIOError)r—   Zuse_dsr.   r.   r1   Útest_missing_res4›  s    
ÿrÑ   c              	   C   s  t  tt¡}t|ƒ}|jdks"t‚| tj	j
j
dt¡ t|ƒ}|jdksLt‚t ¡ }tjdd|d�}|d d dksxt‚dD ]`}| |¡ | |¡ d	||d
df}t|jf|žŽ }	t|jf|žŽ }
t|	d d |
d d ƒ q|| tj	j
j
dt¡ tjtdd�� t|ƒ W 5 Q R X d	S )z-Test CTF reader with mag comps and bad comps.r   rÊ   g      I@g      @)rš   ÚexcludeZbemZnuseé   )r   r-   NTFZsolrR   zinconsistent compensation grader%   )rE   rF   rG   r•   r   r¹   r}   ÚsetattrrÆ   rÇ   rÈ   rÍ   Zmake_sphere_modelZsetup_volume_source_spacer»   r   r:   r   rÎ   ro   rx   ry   )r—   Úmonkeypatchr   Zraw_origZraw_mag_compZsphereÚsrcZgraderœ   Zfwd_origZfwd_mag_compr.   r.   r1   Útest_read_ctf_mag_bad_comp§  s&    

r×   c              	   C   st   dd„ }|   tjjjd|¡ tƒ �}ttt dd�}W 5 Q R X | 	¡ }d|ksRt
‚|jd tjdtjd	�kspt
‚d
S )z#Test handling of invalid meas_date.c                 S   s
   t ddƒS )NÚ r   )Zdate_strZtime_strr.   r.   r1   Ú_convert_time_badÂ  s    z1test_invalid_meas_date.<locals>._convert_time_badr   T)rµ   zNo date or time foundr³   r   )ÚtzN)rÔ   rÆ   rÇ   rÈ   r:   r   r   rG   r•   r¼   r}   r   Úfromtimestampr   Úutc)rÕ   rÙ   r½   r>   r.   r.   r1   Útest_invalid_meas_date¿  s    rÝ   )Rr~   r   r   rj   r   rE   rm   Únumpyrr   r   Znumpy.testingr   r   ro   rÆ   Zmne.io.ctf.infor   r	   r
   r   r   Zmne.transformsr   Zmne.ior   r   r   Zmne.io.compensatorr   Zmne.io.ctf.constantsr   r   Zmne.io.tests.test_rawr   Zmne.tests.test_annotationsr   Z	mne.utilsr   r   r   r   Zmne.datasetsr   r   r   Zmne.io.constantsr   Z	data_pathrG   r•   r·   Zctf_fname_2_trialsZctf_fname_discontZctf_fname_somatorl   rF   r#   rÀ   r®   r�   rƒ   r{   Úsortedr¯   r�   ÚmarkZslowtestZrequires_testing_datar¤   r¨   Zrequires_spm_datar±   Zparametrizer¾   Zrequires_bstraw_datarÃ   rÄ   rÍ   rÎ   rÑ   r×   rÝ   r.   r.   r.   r1   Ú<module>   s–     þ      ú	þ 1
!
 
*
	

