U
    f»{j:z  ã                   @   s,  d dl 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 d dlZd dlZd dlZd dlZd dlmZ d dlZd dl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m Z  d dl!m"Z"m#Z#m$Z$m%Z% d dl&m'Z' d dl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0 ej1dd�Z2e	 3e2dd¡Z4e	 3e4d¡Z5e	 3e4d¡Z6e	 3e4d¡Z7e	 3e4d¡Z8e	 3e2ddd¡Z9e	 3e9d¡Z:e	 3e2dddd¡Z;e	 3e2d¡Z<e	 3e9d¡Z=e	 3e4d¡Z>e	 3e2d¡Z?e	 3e?d¡Z@e2d  ZAe2d! ZBeAd" d# ZCeBd  d$ d% d& ZDeAd" d' ZEeBd  d$ d( d) ZFe	 3e	 GeH¡d*d+d,¡ZIe	 3eId-¡ZJe	 3eId.¡ZKe	 3eId/¡ZLe	 3eId0¡ZMd1\ZNZOZPed2ƒZQd3d4d5gZRd6d7„ ZSejTd8d9�d:d;„ ƒZUejTd8d9�d<d=„ ƒZVejTd8d9�d>d?„ ƒZWejTd@dA�dBdC„ ƒZXejTdDdA�dEdF„ ƒZYejTdDdA�dGdH„ ƒZZejTdDdA�dIdJ„ ƒZ[ejTdDdA�dKdL„ ƒZ\e T¡ dMdN„ ƒZ]ejTd@dA�dOdP„ ƒZ^ejTd@dA�dQdR„ ƒZ_ejTd@dA�dSdT„ ƒZ`ejTd@dA�dUdV„ ƒZadÁdYdZ„Zbe T¡ d[d\„ ƒZce T¡ d]d^„ ƒZde T¡ d_d`„ ƒZeejTdDe f¡ gda�dbdc„ ƒZge T¡ ddde„ ƒZhejTd@e f¡ gda�dfdg„ ƒZiejTdhdi„ ƒZjejTd@dA�djdk„ ƒZkejTd@dA�dldm„ ƒZldndo„ ZmejTdpdq„ ƒZnejTdrds„ ƒZodtdugZpdvdwgZqdxdy„ ZrejsjtejTdzd{„ ƒƒZuejTd|ejvd}ejsjtd~�gd�d€d�„ ƒZwejTd‚gd�dƒd„„ ƒZxejTd‚gd�d…d†„ ƒZyejTd‡gd�dˆd‰„ ƒZzejTdŠd‚gda�d‹dŒ„ ƒZ{ejTdŠd‚gda�d�dŽ„ ƒZ|ed�d�„ ƒZ}d‘d’„ Z~ejTdDdA�d“d”„ ƒZejTd@e f¡ gda�d•d–„ ƒZ€ejTe f¡ gd�d—d˜„ ƒZ�ejTdDe f¡ gda�d™dš„ ƒZ‚ejTdDdA�d›dœ„ ƒZƒejTdDdA�d�dž„ ƒZ„ejTdDdA�dŸd „ ƒZ…ejTdDdA�d¡d¢„ ƒZ†ejTd@dA�d£d¤„ ƒZ‡ejTd@dA�d¥d¦„ ƒZˆejTdDdA�ejsj‰ejsjŠe f¡ gd�d§d¨„ ƒƒƒZ‹d©dª„ ZŒejTd@dA�d«d¬„ ƒZ�ejTdŠdA�d­d®„ ƒZŽejTdDdA�d¯d°„ ƒZ�e T¡ d±d²„ ƒZ�d³d´„ Z‘ejTd@dµda�d¶d·„ ƒZ’ejTdDdA�d¸d¹„ ƒZ“ejTd@dA�dºd»„ ƒZ”d¼d½„ Z•ejs –d¾¡ejTeCeDe f¡ geEeFe f¡ gfd�d¿dÀ„ ƒƒZ—dS )Âé    )ÚcontextmanagerN)Údedent)ÚPath)Úmock)Úread_eventsÚ
pick_typesÚEpochs)Úread_layout)Úcreate_default_subject)Útesting)Ú	has_numbaÚ_compare_version)Úread_raw_fifÚread_raw_ctfÚread_raw_nirxÚread_raw_snirf)Úcluster_level)Ú_plÚ_assert_no_instancesÚnumericsÚBunchÚ_check_qt_versionÚ_TempDir)Úuse_browser_backendF)ÚdownloadZMEGÚsamplezsample_audvis_trunc-ave.fifzsample_audvis_trunc-cov.fifz)sample_audvis_trunc-meg-eeg-oct-4-fwd.fifz)sample_audvis_trunc-meg-eeg-oct-6-fwd.fifÚsubjectsÚbemzsample-1280-bem.fifÚmriúaseg.mgzzsample-oct-4-src.fifzsample_audvis_trunc-trans.fifZCTFztestdata_ctf.dsZNIRxZSNIRFZnirsport_v2z!aurora_recording _w_short_and_accZ	NIRSport2z1.0.3z2021-05-05_001.snirfZaurora_2021_9z2021.9z2021-10-01_002.snirfÚioZtestsÚdataztest_raw.fifztest-eve.fifztest-cov.fifztest-ave.fif)é   gš™™™™™¹¿ç      ð?zVectorview-allzexport/_brainvision.pyzexport/_eeglab.pyzexport/_edf.pyc                 C   s²   dD ]}|   d|¡ qdD ]}|   d|¡ qt d¡dkrXt d¡dk	rXtjd tjd< t dd	¡d
krnd}nd}d |¡}| d¡D ]&}| ¡ }|r†| d¡s†|   d|¡ q†dS )zConfigure pytest options.)ÚslowtestZultraslowtestÚpgtestÚmarkers)Úmatplotlib_configÚ	close_allÚcheck_verboseÚ	qt_configÚprotect_configZusefixturesZPYTEST_QT_APINZQT_APIZMNE_IGNORE_WARNINGS_IN_TESTSÚ ÚtrueÚerrorÚalwaysan  
    {0}::
    # matplotlib->traitlets (notebook)
    ignore:Passing unrecognized arguments to super.*:DeprecationWarning
    # notebook tests
    ignore:There is no current event loop:DeprecationWarning
    ignore:unclosed <socket\.socket:ResourceWarning
    ignore:unclosed event loop <:ResourceWarning
    # ignore if joblib is missing
    ignore:joblib not installed.*:RuntimeWarning
    # TODO: This is indicative of a problem
    ignore:.*Matplotlib is currently using agg.*:
    # qdarkstyle
    ignore:.*Setting theme=.*:RuntimeWarning
    # scikit-learn using this arg
    ignore:.*The 'sym_pos' keyword is deprecated.*:DeprecationWarning
    # Should be removable by 2022/07/08, SciPy savemat issue
    ignore:.*elementwise comparison failed; returning scalar in.*:FutureWarning
    # numba with NumPy dev
    ignore:`np.MachAr` is deprecated.*:DeprecationWarning
    Ú
ú#Úfilterwarnings)Zaddinivalue_lineÚosÚgetenvÚenvironÚformatÚsplitÚstripÚ
startswith)ÚconfigÚmarkerÚfixtureZ
first_kindZwarning_linesZwarning_line© r=   úK/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/conftest.pyÚpytest_configureM   s     ìr?   T)Zautousec              	   c   s`   t jjj}dV  zt jjj|ks$t‚W n4 tk
rZ   t d | jj	| j
j	g¡d ¡ Y nX dS )z@Set to the default logging level to ensure it's tested properly.NÚ.z modifies logger.level)ÚmneÚutilsÚloggerÚlevelÚAssertionErrorÚpytestZfailÚjoinÚmoduleÚ__name__Úfunction)ÚrequestZstarting_levelr=   r=   r>   r)   ƒ   s    
ÿþr)   c                  c   s    ddl m}  dV  |  d¡ dS )z6Close all matplotlib plots, regardless of test status.r   NÚall)Úmatplotlib.pyplotÚpyplotÚclose)Úpltr=   r=   r>   r(   ‘   s    r(   c                 C   s   t | d< dS )zAdd mne to the namespace.rA   N)rA   )Zdoctest_namespacer=   r=   r>   Úadd_mneš   s    rQ   rJ   )Úscopec                	   c   s"   t j d¡� dV  W 5 Q R X dS )z Run a test with debug verbosity.ÚdebugN)rA   rB   Zuse_log_levelr=   r=   r=   r>   Úverbose_debug    s    rT   Úsessionc                   C   s   dt jd< dS )z'Configure the Qt backend for viz tests.r-   Z_MNE_BROWSER_NO_BLOCKN)r3   r5   r=   r=   r=   r>   r*   §   s    r*   c               	      sâ   ddl } ddl m} ztjd }W n tk
r:   d}Y nX tjdd�� t d¡ | j|dd	� W 5 Q R X ddl	m
} | ¡ |ksˆt‚| ¡  d
|jd< zd|jd< W n tk
r¼   Y nX |j}G ‡ fdd„d|ƒ‰ ˆ |_dS )z#Configure matplotlib for viz tests.r   N)ÚcbookZMNE_MPL_TESTING_BACKENDZaggT)ÚrecordÚignore)Úforceéd   z
figure.dpiFzfigure.raise_windowc                       s    e Zd Zd‡‡ fdd„	Z‡  ZS )z2matplotlib_config.<locals>.CallbackRegistryReraiseNc                    s   t ˆ | ƒ |¡ d S ©N)ÚsuperÚ__init__)ÚselfZexception_handlerZsignals)ÚCallbackRegistryReraiseÚ	__class__r=   r>   r]   Í   s    z;matplotlib_config.<locals>.CallbackRegistryReraise.__init__)NN)rI   Ú
__module__Ú__qualname__r]   Ú__classcell__r=   ©r_   )r`   r>   r_   Ì   s   r_   )Ú
matplotlibrV   r3   r5   ÚKeyErrorÚwarningsÚcatch_warningsr2   ZuserM   rN   Úget_backendrE   ZioffZrcParamsZCallbackRegistry)re   rV   ÚwantrP   Úorigr=   rd   r>   r'   ­   s(    


r'   c                   C   s   t  dd¡ ¡ dkotjdkS )z!Determine if running on MacOS CI.ÚCIÚfalser-   Údarwin)r3   r4   ÚlowerÚsysÚplatformr=   r=   r=   r>   Úci_macosÓ   s    ÿrr   c                   C   s    t  dd¡ ¡ dkotj d¡S )z&Determine if running on Azure Windows.ZAZURE_CI_WINDOWSrm   r-   Úwin)r3   r4   ro   rp   rq   r9   r=   r=   r=   r>   Úazure_windowsÚ   s    
ÿrt   c                 C   s   |s| rt  d¡ dS )z(Skip tests that are not reliable on CIs.z1Skipping GUI tests on MacOS CIs and Azure WindowsN)rF   Úskip)rr   rt   r=   r=   r>   Úcheck_gui_ciá   s    rv   c                  C   s   t tdd�} | S )z=Get raw data without any change to it from mne.io.tests.data.T©Úpreload)r   Úfname_raw_io©Úrawr=   r=   r>   Úraw_origè   s    r|   c               	   C   s\   t tdd�} tjtdd�� |  | jd di¡ W 5 Q R X |  | jdd… ¡ | j 	¡  | S )	zb
    Get raw data and pick channels to reduce load for testing.

    (from mne.io.tests.data)
    Trw   Úunit©Úmatchr   ZiasNé	   )
r   ry   rF   ÚwarnsÚRuntimeWarningZset_channel_typesÚch_namesÚpick_channelsÚinfoÚnormalize_projrz   r=   r=   r>   r{   ï   s    
r{   c                  C   s   t tdd�} | S )z(Get ctf raw data from mne.io.tests.data.Trw   )r   Úfname_ctf_continuous)Úraw_ctfr=   r=   r>   rˆ   ÿ   s    rˆ   c                   C   s   t tƒS )z"Get events from mne.io.tests.data.)r   Úfname_event_ior=   r=   r=   r>   Úevents  s    rŠ   é   é   c                 C   s’   t tƒ}ttƒ}t|j||ddddd�}t t dt	|ƒd |¡¡ 
t¡}tjtdd��& t||d| … ttt|ddd	�}W 5 Q R X |j ¡  |S )
zGet epochs.FZbads)ÚmegÚeegZstimZecgZeogÚexcluder   r"   Z
projectionr~   N)ÚpicksÚprojrx   )r   ry   r   r‰   r   r…   ÚnpÚroundZlinspaceÚlenZastypeÚintrF   r�   r‚   r   Úevent_idÚtminÚtmaxr†   )Ústopr�   rŽ   Zn_chanr{   rŠ   r�   Úepochsr=   r=   r>   Ú_get_epochs  s      ÿ" ÿ
r›   c                   C   s
   t ƒ  ¡ S )zd
    Get minimal, pre-loaded epochs data suitable for most tests.

    (from mne.io.tests.data)
    ©r›   Z	load_datar=   r=   r=   r>   rš     s    rš   c                   C   s   t ƒ S )z9Get minimal, unloaded epochs data from mne.io.tests.data.)r›   r=   r=   r=   r>   Úepochs_unloaded%  s    r�   c                   C   s   t dƒ ¡ S )z2Get full, preloaded epochs from mne.io.tests.data.Nrœ   r=   r=   r=   r>   Úepochs_full+  s    rž   )rR   Úparamsc                  C   s    t jtddd�} |  dd¡ | S )NzLeft Auditory)Nr   )Ú	conditionZbaseliner   gš™™™™™É?)rA   Zread_evokedsÚfname_evokedÚcrop)Úevokedr=   r=   r>   Ú_evoked1  s
    ÿr¤   c                 C   s   |   ¡ S )zGet evoked data.©Úcopy)r¤   r=   r=   r>   r£   ;  s    r£   c                   C   s
   t  t¡S )z)Get a noise cov from the testing dataset.)rA   Úread_covÚ	fname_covr=   r=   r=   r>   Ú	noise_covA  s    r©   c                   C   s
   t  t¡S )z.Get noise-covariance (from mne.io.tests.data).)rA   r§   Úfname_cov_ior=   r=   r=   r>   Únoise_cov_ioG  s    r«   c                 C   s   t  t¡}t| ||ƒS )z'Provide inputs for free bias functions.)rA   Úread_forward_solutionÚ	fname_fwdÚ_bias_params©r£   r©   Úfwdr=   r=   r>   Úbias_params_freeM  s    
r±   c                 C   s(   t  t¡}t j|dddd� t| ||ƒS )z(Provide inputs for fixed bias functions.TF)Zforce_fixedZsurf_orir¦   )rA   r¬   r­   Zconvert_forward_solutionr®   r¯   r=   r=   r>   Úbias_params_fixedT  s    
   ÿr²   c           
      C   s’  | j dddd� |d d d  ¡ g g}t t tdd„ |D ƒƒd	f¡|dd	¡}tj ||¡}|d
 d |d ksvt	‚|d | j
ksˆt	‚t |d
 d  ¡ | j¡} | ¡ }|d
 d |d
 d j }|d9 }|jd d |jd d	 …  t | j¡d 7  < tjj |d |d ¡\}}}|| |j }||d d d …< |d jd t|d ƒk�sVt	‚t |d
 d jd	 ¡}	tj |¡�s„|	d }	| ||||	fS )NTr=   )r�   rŽ   r�   Úsrcr   Zvertnoc                 s   s   | ]}t |ƒV  qd S r[   ©r”   )Ú.0Úvr=   r=   r>   Ú	<genexpr>b  s     z_bias_params.<locals>.<genexpr>r"   ÚsolZ	row_namesÚnamesr!   g›+¡†›„=Zprojsé   )r   r¦   rA   ZSourceEstimater’   ZzerosÚsumÚforwardZrestrict_forward_to_stcrE   rƒ   ZEvokedArrayr…   ÚTZflatÚshapeZmake_ad_hoc_covr    r‘   Zmake_projectorr”   ZarangeZis_fixed_orient)
r£   r©   r°   ZverticesZstcZdata_covr!   r‘   Ú_rj   r=   r=   r>   r®   ]  s6       ÿ. ÿ
 r®   c                   c   s   dV  t  ¡  dS )zGarbage collect on exit.N)ÚgcZcollectr=   r=   r=   r>   Úgarbage_collecty  s    rÁ   c              	   c   s&   t dƒ�}|V  | ¡  W 5 Q R X dS )z;Use for epochs/ica when not implemented with pyqtgraph yet.re   N)r   Ú
_close_all)rÁ   Úbackendr=   r=   r>   Úmpl_backend€  s    
rÄ   zmne.viz.tests.test_epochszmne.viz.tests.test_icaZtest_plot_raw_whiteZtest_plot_raw_selectionc                 C   sò   t dd�\}}|rt|ddƒr6t d|› d|› d�¡ zhdd l}t|jdd	ƒ}| jj}| jj}|r~|t	kr~t d
|› d�¡ n|rœ|t
krœt d|› d�¡ W n tk
r¼   t d¡ Y n2X |j}|dkrît|ddƒrît d|› d|› �¡ d S )NT)Z
return_apiú<z5.12zQt API z has version z but pyqtgraph needs >= 5.12!r   z0.2.0zTest-Module "z(" was skipped for mne-qt-browser < 0.2.0zTest "zRequires mne_qt_browserZPyQt5z<=z0.2.6zmne_qt_browser z requires PyQt5, API is )r   r   rF   ru   Úmne_qt_browserÚ__version__rJ   ra   rI   Úpre_2_0_skip_modulesÚpre_2_0_skip_funcsÚ	Exception)rK   Z
qt_versionÚapirÆ   Z	lower_2_0Zm_nameÚf_nameÚverr=   r=   r>   Ú_check_pyqtgraph�  s"    rÎ   c              	   c   sH   t | ƒ tdƒ�.}| ¡  |V  | ¡  ddl}|j ¡  W 5 Q R X dS )z*Use for pyqtgraph-specific test-functions.Úqtr   N)rÎ   r   rÂ   rÆ   Ú_browser_instancesÚclear)rK   rÁ   rÃ   rÆ   r=   r=   r>   Ú
pg_backend©  s    
rÒ   re   rÏ   )Zmarks)rŸ   c              	   c   sj   | j }|dkrt| ƒ t|ƒ�B}| ¡  | dd¡ |V  | ¡  |dkr\ddl}|j ¡  W 5 Q R X dS )z-Parametrizes the name of the browser backend.rÏ   ZMNE_BROWSE_RAW_SIZEz10,10r   N)ÚparamrÎ   r   rÂ   ZsetenvrÆ   rÐ   rÑ   )rK   rÁ   ÚmonkeypatchÚbackend_namerÃ   rÆ   r=   r=   r>   Úbrowser_backend·  s    
rÖ   Ú	pyvistaqtc              	   c   s$   t | jdd��}|V  W 5 Q R X dS )zYield the 3D backends.F©ÚinteractiveN©Ú_use_backendrÓ   ©rK   Ú
options_3drÁ   Úrendererr=   r=   r>   rÞ   Ë  s    rÞ   c              	   c   s$   t | jdd��}|V  W 5 Q R X dS )zYield the PyVista backend.FrØ   NrÚ   rÜ   r=   r=   r>   Úrenderer_pyvistaqtÒ  s    rß   Únotebookc              	   c   s$   t | jdd��}|V  W 5 Q R X dS )zYield the 3D notebook renderer.FrØ   NrÚ   ©rK   rÝ   rÞ   r=   r=   r>   Úrenderer_notebookÙ  s    râ   rH   c              	   c   s$   t | jdd��}|V  W 5 Q R X dS )z&Yield the interactive PyVista backend.TrØ   NrÚ   rá   r=   r=   r>   Úrenderer_interactive_pyvistaqtà  s    rã   c              	   c   s$   t | jdd��}|V  W 5 Q R X dS )z"Yield the interactive 3D backends.TrØ   NrÚ   rá   r=   r=   r>   Úrenderer_interactiveç  s    rä   c              	   c   sT   ddl m} t| ƒ || |d��* ddlm} z
|V  W 5 |j ¡  X W 5 Q R X d S )Nr   )Ú_use_test_3d_backendrØ   )rÞ   )Zmne.viz.backends.rendererrå   Ú_check_skip_backendZmne.viz.backendsrÞ   rÃ   rÂ   )rÕ   rÙ   rå   rÞ   r=   r=   r>   rÛ   î  s    
rÛ   c                 C   sp   ddl m}m}m} | dkr<|ƒ s,t d¡ |ƒ s<t d¡ | dkrTtƒ sTt d¡ | dkrl|ƒ slt d¡ d S )	Nr   )Úhas_pyvistaÚhas_imageio_ffmpegÚhas_pyvistaqt)r×   rà   zTest skipped, requires pyvista.z%Test skipped, requires imageio-ffmpegr×   zTest skipped, requires Qt.z Test skipped, requires pyvistaqt)Úmne.viz.backends.tests._utilsrç   rè   ré   rF   ru   r   )Únamerç   rè   ré   r=   r=   r>   ræ   ú  s    


ræ   c                  C   sZ   ddl m}  | ƒ rtƒ sdS ddlm}m} | ¡ p:|g ƒ}|ƒ }t| ¡ ƒ}| 	¡  |S )zGet the pixel ratio.r   )rç   r#   )ÚQApplicationÚQMainWindow)
rê   rç   r   Zqtpy.QtWidgetsrì   rí   ÚinstanceÚfloatZdevicePixelRatiorO   )rç   rì   rí   r¿   ZwindowÚratior=   r=   r>   Úpixel_ratio	  s    rñ   c                 C   s.   dD ] }t  t t|¡t| | ƒ¡ qt| ƒS )zBCopy MNE-testing-data subjects_dir to a temp dir for manipulation.)r   Z	fsaverage)ÚshutilÚcopytreeÚoprG   Úsubjects_dirÚstr)Útmp_pathÚkeyr=   r=   r>   Úsubjects_dir_tmp  s    rù   c                 C   s`   | d }t  |¡ t|tdd� |d }t  |d ¡ dD ] }t td d | || ¡ q:|S )zCopy fewer files to a tmp_path.r   T)rõ   Zfs_homeÚverboser   r   )r   Zsurf)r3   Úmkdirr
   Ú	test_pathÚmakedirsrò   ró   )r÷   Zsubjects_pathZsample_pathÚdirnamer=   r=   r>   Úsubjects_dir_tmp_few  s    
ÿ ÿrÿ   c                 C   s\   |   ¡ jdd�}| |jddd… ¡ t|jƒdks8t‚t t¡}t 	dd|j
¡}|||fS )z>Compute a small evoked/cov/sphere combo for use with forwards.T)r�   Né   éM   Úauto)r¦   r   r„   rƒ   r”   rE   rA   r§   r¨   Zmake_sphere_modelr…   )r¤   r£   ÚcovÚspherer=   r=   r>   Ú_evoked_cov_sphere2  s    
r  c                 C   s*   | \}}}t  t¡}t j|jt||dd�S )ú-Compute a forward for a surface source space.ç      @©Zmindist)rA   Zread_source_spacesÚ	fname_srcÚmake_forward_solutionr…   Úfname_trans)r  r£   r  r  Zsrc_surfr=   r=   r>   Ú	_fwd_surf=  s    

    ÿr  c              	   C   sŠ   t  d¡ | \}}}ddg}t jtdd�� tjdd|td� W 5 Q R X d	|d
 d
d…  |d
< tjdd|tdd�}tj|jt	||dd�S )r  ÚnibabelzLeft-Cerebellum-Cortexzright-Cerebellum-Cortexz!Did you mean one of \['Right-Cerer~   r   g      4@)ÚposÚvolume_labelrõ   ÚRr"   NF)r  r  rõ   Úadd_interpolatorr  r  )
rF   ÚimportorskipÚraisesÚ
ValueErrorrA   Úsetup_volume_source_spacerõ   r
  r…   r  )r  r£   r  r  Úvolume_labelsZsrc_volr=   r=   r>   Ú_fwd_subvolumeF  s6    

ÿ  þ   þ    ÿr  c           
   	   C   s  t | |d�}tjtdd�� |d d |d d   W 5 Q R X |d  ¡ }|d }dD ]^\}}|| }}|d }	t|ƒd	kr–||	 ||	  }}|d	 }	tj||	 ||	 g|d
�||	< qV|d d jd	 |d d< |d d d |d< |d |d  |d< ||d< |S )z2Create all three forward types (surf, vol, mixed).)ÚsurfaceÚvolumezInvalid source space with kindsr~   r  r³   r  )))Z	source_rrr   ))Z	source_nnr   ))r¸   r!   r"   ))Z	_orig_solr"   r   r"   )Úaxisr¸   r!   Zncolrº   ZnsourceÚmixed)	ÚdictrF   r  ÚRuntimeErrorr¦   r”   r’   Zconcatenater¾   )
r  r  Zfwdsr°   Úf2Úkeysr  ÚaÚbrø   r=   r=   r>   Ú_all_src_types_fwdY  s&    ÿ"
 r"  c              
   C   sl   | \}}}t ƒ }| ¡ D ]J\}}|d j|ks2t‚tjtdd�� tj 	|j
||¡||< W 5 Q R X q||fS )ú&Compute inverses for all source types.r³   zhas been reducedr~   )r  ÚitemsÚkindrE   rF   r�   r‚   rA   Zminimum_normZmake_inverse_operatorr…   )r  r"  r£   r  r¿   Úinvsr%  r°   r=   r=   r>   Ú_all_src_types_inv_evokedv  s    
  ÿr'  c                 C   s*   | \}}dd„ |  ¡ D ƒ}| ¡ }||fS )zAAll source types of inverses, allowing for possible modification.c                 S   s   i | ]\}}||  ¡ “qS r=   r¥   )rµ   rø   Úvalr=   r=   r>   Ú
<dictcomp>‡  s      z,all_src_types_inv_evoked.<locals>.<dictcomp>)r$  r¦   )r'  r&  r£   r=   r=   r>   Úall_src_types_inv_evokedƒ  s    r*  c                 C   s$   | \}}}|d   ¡ |  ¡ |  ¡ fS )r#  r  r¥   )r  r"  r£   r  r¿   r=   r=   r>   Úmixed_fwd_cov_evokedŒ  s    
r+  c               
   C   s�   t  d¡ t t¡} t jtdd�� tjddd| dtt	d�}W 5 Q R X t 
¡ \}}t| ƒd	ksbt‚| d
 dksrt‚|d d
ks‚t‚|t| ƒ|fS )z&Create a 7mm source space with labels.r  zFound no usable.*Left-vessel.*r~   r   g      @r   F)r   r  r  r   rõ   é.   r   ÚUnknown)rF   r  rA   Zget_volume_labels_from_asegÚ
fname_asegr�   r‚   r  Ú	fname_bemrõ   Zread_freesurfer_lutr”   rE   Útuple)r  r³   Zlutr¿   r=   r=   r>   Úsrc_volume_labels“  s"    

    ýr1  c                  O   s   d}t dƒ‚d S )NTzTest should not download)rE   )ÚargsÚkwargsZ__tracebackhide__r=   r=   r>   Ú_fail¦  s    r4  c                 C   s   ddl }|  |dt¡ dS )z<Prevent downloading by raising an error when it's attempted.r   NÚretrieve)ÚpoochÚsetattrr4  )rÔ   r6  r=   r=   r>   Údownload_is_error«  s    r8  c                	   c   s.   t j tjddddœ¡� dV  W 5 Q R X dS )zDisable advanced 3d rendering.rm   )ZMNE_3D_OPTION_ANTIALIASZMNE_3D_OPTION_DEPTH_PEELINGZMNE_3D_OPTION_SMOOTH_SHADINGN)r   Úpatchr  r3   r5   r=   r=   r=   r>   rÝ   µ  s    ýÿrÝ   c               	   c   s0   t ƒ } tj tjd| i¡� dV  W 5 Q R X dS )zProtect ~/.mne.Z_MNE_FAKE_HOME_DIRN)r   r   r9  r  r3   r5   )Útempr=   r=   r>   r+   Â  s    r+   c              	   c   s\  d}t | jƒt |ƒ@ t ƒ ks t‚|D ]2}|| jkr$|  |¡ ¡ dk}|  |¡jj} qXq$|sfdV  dS ddlm} t dd„ t	 
¡ D ƒƒ}dV  |ƒ  z| jj}W n tk
r¸   d}Y nX |d	krÆdS t|d
ƒ t	 
¡ }tƒ }	|D ]N}
z|
jj}W n tk
�r   Y n&X | d¡�r.t|
ƒ|k�r.|	 |¡ ~
qâ~~~t|	ƒdk�sXtdd |	¡ ƒ‚dS )z4Ensure that brain can be properly garbage collected.)rä   rã   rÞ   rß   râ   r×   Nr   )ÚBrainc                 s   s   | ]}t |ƒV  qd S r[   )Úid)rµ   Úor=   r=   r>   r·   ß  s     zbrain_gc.<locals>.<genexpr>ZfailedZpassedÚafterZvtkzVTK objects linger:
r0   )ÚsetÚfixturenamesrE   ZgetfixturevalueZ_get_3d_backendrÃ   rÂ   Zmne.vizr;  rÀ   Zget_objectsÚnodeZharvest_rep_callrÊ   r   Úlistr`   rI   r9   r<  Úappendr”   rG   )rK   r  rø   Zis_pvZ
close_funcr;  rX   ZoutcomeZobjsÚbadr=  rë   r=   r=   r>   Úbrain_gcÊ  sD    
ÿ


rE  c                    sº  | j jj}|dkrdS tdƒ zddl}W n tk
rH   tdƒ Y dS X ddlm} | | ¡}t	ƒ }| 
¡ D ]x\}}t| d¡d ƒj}	d}
|	d|	dd… |
kr¦d	nd
… }	|	d  d¡sÄ|	d }	d |	¡}| |d¡|d  ||< qntt| 
¡ ƒdd„ d�ddd… }|d|… }t|ƒ�r¶|ƒ }| ¡  | dd|› dt|ƒ› �¡ t|Ž \}}dd„ |D ƒ}tdd„ |D ƒƒ‰ ‡ fdd„|D ƒ}t||ƒD ]"\}}| | d¡› |› �¡ �q’dS )zHandle the end of the session.Nr0   r   z+Module-level timings require pytest-harvest)ÚTerminalWriterú:))rA   Zviz)rA   Zpreprocessingé   r   rº   éÿÿÿÿz.py)r,   ú/Zpytest_duration_sc                 S   s   | d S )Nr"   r=   )Úxr=   r=   r>   Ú<lambda>  ó    z&pytest_sessionfinish.<locals>.<lambda>)rø   ú=zslowest z test modulec                 S   s   g | ]}|d ›d�‘qS )z0.2fzs totalr=   ©rµ   Útimingr=   r=   r>   Ú
<listcomp>  s     z(pytest_sessionfinish.<locals>.<listcomp>c                 s   s   | ]}t |ƒV  qd S r[   r´   rO  r=   r=   r>   r·     s     z'pytest_sessionfinish.<locals>.<genexpr>c                    s   g | ]}|  ˆ ¡‘qS r=   ©ÚrjustrO  rR  r=   r>   rQ    s     é   )r:   ÚoptionZ	durationsÚprintÚpytest_harvestÚImportErrorZpy.iorF  Zget_session_synthesis_dctr  r$  r   r7   ÚpartsÚendswithrG   ÚgetÚsortedrB  r”   ÚlineÚsepr   ÚzipÚmaxÚljust)rU   Z
exitstatusÚnrW  rF  ÚresÚfilesrø   r(  rY  Zsplit_submodulesZfile_keyÚwriterr¹   Ztimingsrë   rP  r=   rR  r>   Úpytest_sessionfinishú  s@    

 
"
rf  ©ÚNumbaÚNumPyc                 c   s€   |j dkst‚|j dkr\tr\|  tdtj¡ |  tdtj¡ |  tdtj¡ |  tdtj	¡ |j dkrttstt
 d¡ |j V  d	S )
z1Test both code paths on machines that have Numba.rg  ri  Z_get_buddiesZ_get_selvesZ_where_firstZ_arange_divrh  zNumba not installedN)rÓ   rE   r   r7  r   Z_get_buddies_fallbackZ_get_selves_fallbackZ_where_first_fallbackr   Z_arange_div_fallbackrF   ru   )rÔ   rK   r=   r=   r>   Únumba_conditional#  s2      ÿ  ÿ  ÿ  ÿ
rj  c            	   
   c   s¦   z8dd l } ddlm} ddlm} ddlm} dd l}W n6 tk
rn } zt	 
d|› �¡ W Y ¢S d }~X Y nX |d d�}| jddd	�}|||d
�}|V  | ¡  d S )Nr   )ÚAsyncKernelManager)ÚNotebookClient)ÚButtonzSkipping Notebook test: )r:   aÀ  
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata":{},
   "outputs": [],
   "source":[]
  }
 ],
 "metadata": {
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version":3},
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}r   )Z
as_version)Úkm)ÚnbformatZjupyter_clientrk  Znbclientrl  Ú
ipywidgetsrm  Ú
ipyvtklinkrÊ   rF   ru   ZreadsÚ_cleanup_kernel)	ro  rk  rl  rm  rq  Úexcrn  ÚnbÚclientr=   r=   r>   Ú	_nbclient6  s    &
ærv  c                 #   s    ˆ   ¡  d‡ fdd„	}|V  dS )z"Execute Python code in a notebook.Fc              	      sX   ˆ   ¡  ˆ  ¡ �> ˆ jd k	s t‚tdi t| ƒd�}ˆ j|ddd� ˆ  ¡  W 5 Q R X d S )NÚcode)Z	cell_typeÚmetadataÚsourcer   )Zexecution_count)Zreset_execution_trackersZsetup_kernelÚkcrE   r   r   Zexecute_cellZset_widgets_metadata)rw  ÚresetÚcell©rv  r=   r>   Úexecuteg  s    
znbexec.<locals>.executeN)F)rr  )rv  r~  r=   r}  r>   Únbexeca  s    r  c                 C   sŽ   dt | ddƒkrŠ| jd }t t | j| j d¡d ƒ¡}| ¡ }d}t|ƒD ]\}}| 	d¡rL qdqLd 
||d… ¡}||fd	d
„}|| _dS )z$Run notebook code written in Python.r  r@  r=   ú[r   z    r0   Nc                 S   s   | |ƒ d S r[   r=   )r  rw  r=   r=   r>   Úrun~  s    z pytest_runtest_call.<locals>.run)ÚgetattrZfuncargsÚinspectÚ	getsourcerH   rë   r7   Ú
splitlinesÚ	enumerater9   rG   Zruntest)Úitemr  rw  ÚciÚcr�  r=   r=   r>   Úpytest_runtest_callr  s    

rŠ  z%ignore:.*Extraction of measurement.*:c                 C   s.   t  d¡ t| jd dd�t| jd dd�fS )z,Return a (raw_nirx, raw_snirf) matched pair.Zh5pyr   Trw   r"   )rF   r  r   rÓ   r   )rK   r=   r=   r>   Ú
nirx_snirf…  s    
ÿr‹  )r‹   TFrŒ   )˜Ú
contextlibr   rƒ  Útextwrapr   rÀ   r3   Úos.pathÚpathrô   Úpathlibr   rò   rp   rg   rF   Zunittestr   Únumpyr’   rA   r   r   r   Zmne.channelsr	   Z	mne.coregr
   Zmne.datasetsr   Z	mne.fixesr   r   Zmne.ior   r   r   r   Z	mne.statsr   Z	mne.utilsr   r   r   r   r   r   Zmne.viz._figurer   Z	data_pathrü   rG   Zs_pathr¡   r¨   r­   Zfname_fwd_fullZbem_pathr/  r.  rõ   r	  r  Zctf_dirr‡   Z	nirx_pathZ
snirf_pathZ	nirsport2Znirsport2_snirfZnirsport2_2021_9Znirsport2_20219_snirfrþ   Ú__file__Úbase_dirry   r‰   rª   Zfname_evoked_ior–   r—   r˜   Z	vv_layoutZcollect_ignorer?   r<   r)   r(   rQ   rT   r*   r'   rr   rt   rv   r|   r{   rˆ   rŠ   r›   rš   r�   rž   Z_pytest_paramr¤   r£   r©   r«   r±   r²   r®   rÁ   rÄ   rÈ   rÉ   rÎ   Úmarkr%   rÒ   rÓ   rÖ   rÞ   rß   râ   rã   rä   rÛ   ræ   rñ   rù   rÿ   r  r  r  r"  r'  r*  r+  r$   Zparametrizer1  r4  r8  rÝ   r+   rE  rf  rj  rv  r  rŠ  r2   r‹  r=   r=   r=   r>   Ú<module>   sr   ÿÿÿÿ
ý6











%














	


	








ÿÿþ



























	




/)


*


þ