U
    f»{jí|  ã                   @   s,  d 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
 ddlm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mZmZ ddlmZ ddlmZ ddlmZm Z m!Z! da"da#G dd„ dƒZ$G dd„ deƒZ%dd„ Z&dd„ Z'dd„ Z(ed#dd„ƒZ)dd„ Z*dd „ Z+ed!d"„ ƒZ,dS )$z3Base classes and functions for 2D browser backends.é    N)ÚABCÚabstractmethod)ÚOrderedDict)Úcontextmanager)Údeepcopy)Úcycleé   )ÚverboseÚ
get_configÚ
set_config)Ú_sync_onset)Ú_handle_default)ÚloggerÚ_validate_typeÚ_check_option)Ú_DATA_CH_TYPES_SPLITé   )ÚVALID_BROWSE_BACKENDS)Ú_get_color_listÚ_setup_plot_projectorÚ_show_browserc                   @   s   e Zd ZdZdd„ ZdS )ÚBrowserParamsz+Container object for 2D browser parameters.c                 K   s   d| _ t| ƒjf |Ž d S )NÚescape)Z	close_keyÚvarsÚupdate)ÚselfÚkwargs© r   úN/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/viz/_figure.pyÚ__init__    s    zBrowserParams.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r      s   r   c                   @   s@  e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdGdd„Zdd„ ZdHdd„Zdd „ Zd!d"„ ZdId%d&„Zd'd(„ Zed)d*„ ƒZd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ ZdJd7d8„Zed9d:„ ƒZed;d<„ ƒZ ed=d>„ ƒZ!ed?d@„ ƒZ"edAdB„ ƒZ#edCdD„ ƒZ$edEdF„ ƒZ%dS )KÚBrowserBasezyA base class containing for the 2D browser.

    This class contains all backend-independent attributes and methods.
    c                 K   s  ddl m} ddlm} ddlm} d | _d | _d | _t	f |Ž| _
| dd ¡}| dd ¡}t||ƒrnd| j
_n<t||ƒr‚d| j
_n(t||ƒr–d| j
_ntd	t|ƒ› d
�ƒ‚t d| j
j› d�¡ d | j
_| j
jdk�rt| j
j|ƒrîd| j
_nt| j
j|ƒ�rd| j
_d| j
j| j
jfk| j
_d| j
_d | j
_t| j
dƒ�rXt dd„ | j
jD ƒ¡| j
_tƒ | j
_t| j
dƒ�r€| j
jd k	| j
_t ddddddddddd�
| j
_!tƒ | j
_"tƒ | j
_#|d k	�rät $|j%d d… ¡d |j&d  | j
_'tƒ | j
_(tƒ | j
_)tƒ | j
_*tƒ | j
_+tƒ | j
_,t ƒ | j
_-d | j
_.d| j
_/tƒ | j
_0tƒ | j
_1d| j
_2d | j
_3d | j
_4t| j
dƒ�r€| j
j5�rxdnd| j
_6t ƒ | j
_7t ƒ | j
_8tƒ | j
_9d | j
_:d | j
_;d | j
_<d | j
_=d | j
_>| j
j�ròtj?| j
j@t Ad¡d d!�d | j
_B|  C¡  | j
jdk�s|  D¡  d S )"Nr   ©Ú
BaseEpochs)ÚBaseRaw)ÚICAÚinstÚicaÚrawÚepochsz1Expected an instance of Raw, Epochs, or ICA, got Ú.zOpening ú browser...r   Úprojsc                 S   s   g | ]}|d  ‘qS )Zactiver   )Ú.0Úpr   r   r   Ú
<listcomp>U   s   ÿz(BrowserBase.__init__.<locals>.<listcomp>Ú	noise_covr   é   é   é   é   é   é   é	   )
ÚpatchÚgridÚannÚeventsÚbadsÚdataÚmagÚgradZscalebarZvlineÚsfreqFÚ	butterflyç      à?g      ð?Zvalid)Úmode)EÚ r&   Úior'   Zpreprocessingr(   Úbackend_nameÚ_dataZ_timesr   ÚmneÚgetÚ
isinstanceÚinstance_typeÚ	TypeErrorÚtyper   ÚdebugÚica_typeÚica_instÚ	is_epochsÚch_startÚ	projectorÚhasattrÚnpÚarrayr/   Zprojs_activeÚlistÚwhitened_ch_namesr3   Úuse_noise_covÚdictZzorderZepoch_tracesÚ
bad_epochsÚdiffÚtimesÚinfoÚsampling_periodÚannotationsZhscroll_annotationsÚannotation_segmentsZannotation_textsÚnew_annotation_labelsÚannotation_segment_colorsZannotation_hover_lineZdraggable_annotationsZevent_linesZevent_textsZvline_visibleZdecim_timesZ
decim_datarD   Zscale_factorZ	scalebarsZscalebar_textsÚ
child_figsZfig_helpZfig_projÚfig_histogramZfig_selectionZfig_annotationZconvolveÚboundary_timesZonesZ	midpointsÚ_update_picksÚ_update_projector)r   r   r&   r'   r(   r)   r*   r   r   r   r   ,   s¢    






ÿ

ÿ
    ÿ



ÿ












 ÿÿzBrowserBase.__init__c                 C   s    t t| jjjjƒt| jjƒB ƒS )z<Get the unique labels in the raw object and added in the UI.)ÚsortedÚsetrK   r)   rc   Údescriptionre   ©r   r   r   r   Ú_get_annotation_labels�   s    
ÿz"BrowserBase._get_annotation_labelsc           	      C   sÎ   t | jdtƒ ƒ}|  ¡ }tdd�\}}t|ƒ}| ¡ D ] \}}||kr6||kr6t|ƒ q6t|ƒD ]F\}}||krtq`q`| 	¡  
d¡s�| 	¡  
d¡rš|||< q`t|ƒ||< q`|| j_dd„ |D ƒ| j_d| j_dS )	z9Set up colors for annotations; init some annotation vars.rf   T)rc   ÚbadÚedgec                 S   s   i | ]
}|d “qS )Tr   )r0   Úlabelr   r   r   Ú
<dictcomp>¥   s      z8BrowserBase._setup_annotation_colors.<locals>.<dictcomp>N)ÚgetattrrK   r]   rp   r   r   ÚitemsÚnextÚ	enumerateÚlowerÚ
startswithrf   Zvisible_annotationsZshow_hide_annotation_checkboxes)	r   Zsegment_colorsÚlabelsÚcolorsÚredZcolor_cycleÚkeyÚcolorÚidxr   r   r   Ú_setup_annotation_colors’   s$    
ÿ
z$BrowserBase._setup_annotation_colorsc                 C   sx   t ƒ }| jj}t|jƒrft|jƒD ]B\}}t||d ƒ}|t|d d| jjd  ƒ }| 	||f¡ q"t
 |¡| j_dS )z/Update the array of annotation start/end times.ZonsetÚdurationr   rC   N)rZ   rK   r)   Úlenrc   rx   r   Úmaxra   ÚappendrX   rY   rd   )r   Úsegmentsr+   r€   ZannotZannot_startZ	annot_endr   r   r   Ú_update_annotation_segments¨   s    

ÿz'BrowserBase._update_annotation_segmentsc              	      sz   t  ˆ jj¡d }ˆ jj ¡ �  ‡ fdd„|D ƒˆ jjd< W 5 Q R X tˆ jjˆ jjdˆ jjƒ\}}t	|ƒˆ j_
|ˆ j_dS )z8Update the data after projectors (or bads) have changed.r   c                    s   g | ]}t ˆ jj| ƒ‘qS r   )r   rK   r/   )r0   Úixro   r   r   r2   ½   s   ÿz1BrowserBase._update_projector.<locals>.<listcomp>r/   TN)rX   ÚwhererK   Zprojs_onra   Z_unlockr   r3   r\   rZ   r[   rV   )r   ÚindsZprojZwh_chsr   ro   r   rk   ¸   s    
ÿ ÿzBrowserBase._update_projectorc                 C   s”   | j j| }| j j| }| j jd }||k}|rD| |¡ | j j}n2||krX| |¡ qDt| j dƒrr| j j| }nd}|| j jd< |  	¡  |||fS )z?Mark/unmark bad channels; `idx` is index of *visible* channels.r?   Ú	ch_colorsN)
rK   ÚpicksÚch_namesra   r…   Zch_color_badÚremoverW   r‹   rk   )r   r€   ÚpickÚch_namer?   Z
marked_badr   r   r   r   Ú_toggle_bad_channelÅ   s    

zBrowserBase._toggle_bad_channelc                 C   sh   |   |¡}| jjj ¡  |¡}|| jjkr>| jj |¡ d}n"| jj |¡ | jj 	¡  | jj
}||fS )NÚnone)Ú_get_epoch_num_from_timerK   r)   Ú	selectionÚtolistÚindexr^   rŽ   r…   ÚsortZepoch_color_bad)r   ZxtimeZ	epoch_numZepoch_ixr   r   r   r   Ú_toggle_bad_epochÝ   s    
zBrowserBase._toggle_bad_epochc                 C   s6   | j jd k	r2| j j | j _|  ¡  |  ¡  |  ¡  d S ©N)rK   r3   r\   rk   Ú_update_yaxis_labelsÚ_redrawro   r   r   r   Ú_toggle_whiteningê   s
    zBrowserBase._toggle_whiteningc                 C   sˆ   | j jr4| j jdk	r4|  ¡ }t t| ¡ ƒ¡| j _nP| j jrJ| j j	| j _n:t
| j j| j j| j j ƒ}| j j	| | j _t| j jƒ| j _dS )z&Compute which channel indices to show.N)rK   rD   Úch_selectionsÚ_make_butterfly_selections_dictrX   ÚconcatenateÚtupleÚvaluesrŒ   Zch_orderÚslicerU   Z
n_channelsrƒ   )r   Úselections_dictZ_slicer   r   r   rj   õ   s    ÿzBrowserBase._update_picksc           	      C   s    ddl m} t| jjƒ}dD ]}| |d¡ q|d| jjdd�}t|ƒrœ| jj 	¡  
|d ¡}| ¡ D ]4\}}|dkrftj||gd	d
�}t |¡| ||< qf|S )z?Make an altered copy of the selections dict for butterfly mode.r   )Ú_get_stim_channel)ZVertexZCustomNF)Zraise_errorr   ZMiscT©Úinvert)Úutilsr¤   r   rK   r�   Úpopra   rƒ   r�   r•   r–   rv   rX   Úin1drY   )	r   r¤   r£   Zselection_groupZstim_chZ	stim_pickZ_selÚ_picksZ	stim_maskr   r   r   rž     s    z+BrowserBase._make_butterfly_selections_dictc                 C   sn   | j j| j j }|| j j }| j jrPt t ||g¡| j jd  ¡ 	t
¡\}}n| j j ||f¡\}}||fS )NrC   )rK   Út_startZ
first_timer‚   rT   rX   ÚroundrY   ra   ZastypeÚintr)   Ztime_as_index)r   Z	start_secZstop_secÚstartÚstopr   r   r   Ú_get_start_stop  s    
ÿÿ
zBrowserBase._get_start_stopNc                 C   sÂ   d| j j| j jfkrR|dkr4| j jdd…|d…f S | j jdd…||d …f S nlt | j j| j j| j j ¡}|| j j	 }t
||ƒ}tj| j jj|d�dd�}t ||¡| j jd  }||fS dS )z.Retrieve the bit of data we need for plotting.r+   Nr   )Úiteméÿÿÿÿ©ÚaxisrC   )rK   rN   rR   r)   rX   Úsearchsortedri   r«   rb   Zn_epochsr¢   rŸ   Úget_dataZarangera   )r   r®   r¯   Zix_startZix_stopr±   r@   r`   r   r   r   Ú
_load_data#  s    
ÿÿ
zBrowserBase._load_datac                 C   sî   ddl m}m} | jj\}}||k ||k@ }	t ||	 |¡| }t ||	 |¡| }t||ƒD ]Š\}
}t 	t 
|| jj¡¡d }t|ƒdkr� qê|||
|…f }t| jjtjƒrÄ||| jjdd�}n||| jjdddƒ}||||
|…f< q^dS )z,Filter (with same defaults as raw.filter()).r   )Ú_overlap_add_filterÚ	_filtfiltr   F)ÚcopyNr   )Úfilterr¸   r¹   rK   Zfilter_boundsrX   ÚmaximumÚminimumÚzipr‰   r©   Z
picks_datarƒ   rM   Úfilter_coefsZndarray)r   r@   r®   r¯   rŒ   r¸   r¹   ZstartsZstopsÚmaskÚ_startÚ_stoprª   Z	this_datar   r   r   Ú_apply_filter9  s0      ÿ    ÿzBrowserBase._apply_filterc                 C   sF  | j jdk	r(|r|j d¡ | j j| }|| }| j jr\|rH|j d¡ |tj|ddd�8 }| j jdk	rˆ|rx|j d¡ |  ||||¡ |r˜|j d¡ | j j	| }| j j
| }|d	k}t t || j j¡tj|| j jd
 dd�¡}	t | j jj¡|ƒ}
|| jdd�|
|< | j jd |
|	< d|
|
dk< |d|
dd…tjf   }|S )z,Update self.mne.data after user interaction.NzApplying Projectors...zRemoving DC...r   T)r´   ZkeepdimszApply Filter...zScale Data...Zstimr?   r¥   r²   r³   Zwhitenedr   r   )rK   rV   ZprocessTextÚemitZ	remove_dcrX   Znanmeanr¿   rÃ   r�   Úch_typesÚlogical_andr©   r[   ra   Z	vectorizeÚscalingsÚ__getitem__r„   Znewaxis)r   r@   r®   r¯   rŒ   ÚthreadZ
this_namesZ
this_typesZstimsÚwhiteZnormsr   r   r   Ú_process_dataM  s:    ÿÿzBrowserBase._process_datac                 C   sD   |   ¡ \}}|  ||¡\}}|  |||| jj¡}|| j_|| j_d S r™   )r°   r·   rË   rK   rŒ   r@   r`   )r   r®   r¯   r@   r`   r   r   r   Ú_update_datas  s
    zBrowserBase._update_datac                 C   s&   | j jj}|t | j jdd … |¡ S )Nr   )rK   r)   r”   rX   rµ   ri   )r   ÚtimeZ
epoch_numsr   r   r   r“   }  s    
z$BrowserBase._get_epoch_num_from_timeTFc                 C   s,   |r|   ¡  |  ¡  |r(| jjs(|  ¡  dS )zRedraws backend if necessary.N)rÌ   Z_draw_tracesrK   rT   Z_draw_annotations)r   Zupdate_datarc   r   r   r   r›   �  s
    zBrowserBase._redrawc                    s4  ddl m} t dˆ jj› d�¡ ˆ jjdkrnt ˆ jjj	ˆ jj
¡ ¡ d }ˆ jj |¡ t dˆ jj
› �¡ ˆ jjdkr®ˆ jjd ˆ jjjd< t d	ˆ jjd p¤d
› �¡ n,ˆ jjdkrÚ‡ fdd„ˆ jjd D ƒˆ jj_d dd„ ˆ  ¡ D ƒ¡}td|dd� tˆ jjƒ�r0ˆ jjd }||ƒ ˆ  |¡ �q dS )z1Handle close events (via keypress or window [x]).r   )ÚclosezClosing r.   r,   z9The following epochs were marked as bad and are dropped:
)r+   r,   r?   zChannels marked as bad:
r’   r*   c                    s   g | ]}ˆ j jj |¡‘qS r   )rK   r*   Ú
_ica_namesr–   )r0   Úchro   r   r   r2   ¡  s   ÿz&BrowserBase._close.<locals>.<listcomp>ú,c                 S   s   g | ]}t |ƒ‘qS r   )Ústr)r0   Úir   r   r   r2   ¤  s     ZMNE_BROWSE_RAW_SIZEF)Zset_envr²   N)Zmatplotlib.pyplotrÎ   r   rQ   rK   rN   rX   r©   r)   r”   r^   ZnonzeroZdropra   r*   ÚexcludeÚjoinÚ	_get_sizer   rƒ   rg   Ú_close_event)r   ÚeventrÎ   Zbad_ixsZstr_sizeÚfigr   ro   r   Ú_close‹  s2    ÿÿÿ

ÿzBrowserBase._closec                 K   s   d S r™   r   )r   Úfig_namer   r   r   r   Ú_new_child_figure¯  s    zBrowserBase._new_child_figurec                 C   sJ   | j j}| j j| }|dkr(|  |¡}n|dkr<|  |¡}n
|  |¡}|S )z:Show context figure; idx is index of **visible** channels.r+   r*   )rK   rN   rŒ   Ú_create_ch_location_figÚ_create_ica_properties_figÚ_create_epoch_image_fig)r   r€   r)   r�   rÙ   r   r   r   Ú_create_ch_context_fig³  s    
z"BrowserBase._create_ch_context_figc                 C   sÊ   ddl m}m} | jj| }| jj| }|tkr4dS d|› �}| jdd|d�}| |¡ | 	d¡}|› d|| › d	�}|| jj
|||d
dd�}	t |jj|g¡}
|j ¡  d|j_d|j_|j |
¡ |S )zShow channel location figure.r   )Ú_channel_type_prettyprintÚplot_sensorsNzLocation of )r5   r5   ©ÚfigsizerÛ   Zwindow_titleéo   z position (ú)ÚselectF)Úch_typeÚaxesÚtitleÚkindÚshowg333333Ó?r4   )r§   rá   râ   rK   r�   rÅ   r   rÜ   ÚsuptitleÚadd_subplotra   rX   r©   ÚlassoZ
disconnectZalpha_otherZlinewidth_selectedZstyle_sensors)r   r�   rá   râ   r�   rè   rê   rÙ   ÚaxÚ_rŠ   r   r   r   rÝ   À  s.    
ÿ

  ÿ
z#BrowserBase._create_ch_location_figc           
      C   sº   ddl m}m}m} | jj| }|| jjjkr2dS | jjj |¡}|› d�}| j	dd|d�}| 
|¡ ||d�\}}	t| jdƒs–|| jj| jjƒ| j_|| jj| jj||	| jjd	d
� |S )z/Show ICA properties for the selected component.r   )Ú_create_properties_layoutÚ_prepare_data_ica_propertiesÚ_fast_plot_ica_propertiesNz properties)r8   r7   rã   ©rÙ   Údata_ica_propertiesF)rŒ   ré   Zprecomputed_datarì   )Zmne.viz.icarò   ró   rô   rK   r�   r*   rÏ   r–   rÜ   rí   rW   rS   rö   )
r   r€   rò   ró   rô   r�   r�   rê   rÙ   ré   r   r   r   rÞ   Ù  s2    
ÿ
 ÿ    þz&BrowserBase._create_ica_properties_figc                 C   s°   ddl m} ddlm} | jj| }d|› d�}| jdd|d�}||_|d	d
d�}| |dd…dd…f ¡ | |ddd…f ¡ | |dd…df ¡ || jj	||dd� |S )z+Show epochs image for the selected channel.r   )ÚGridSpec)Úplot_epochs_imagezEpochs image (ræ   )r7   r5   Nrã   r4   é
   )ZnrowsZncolsr   r:   F)rŒ   rÙ   rì   )
Zmatplotlib.gridspecr÷   Zmne.vizrø   rK   r�   rÜ   rí   rî   r)   )r   r�   r÷   rø   r�   rê   rÙ   Úgsr   r   r   rß   ò  s    ÿz#BrowserBase._create_epoch_image_figc                 C   sÚ  | j j}tƒ }tj| ¡ dd�}dD ]&}||kr$|j| j j|k  ¡ ||< q$t	dƒ}t	dƒ}t	dƒ}t	dƒ}d}	d	d
dt
|ƒ  f}
| j|
d|	d�}t| ¡ ƒD ]¾\}\}}| t
|ƒd
|d
 ¡}|j|| || dd� d}d}|jdk	�r||jk�r|j| ||  }d|d f}|j|||  d|| |d� |dk	r |j||fd| ¡ d
 fdd� q |j|	dd� t|dƒ�r´t|jddd�d
|jddd� | d¡d
| d¡ d �}ntƒ }|jf d!d"i|—Ž || j _|S )#z4Create peak-to-peak histogram of channel amplitudes.r   r³   )ZeegrA   rB   ÚunitsÚtitlesr   rÇ   z$Histogram of peak-to-peak amplitudesr5   r   g      ø?rh   rã   ZCount)rê   ZxlabelZylabelNg        gš™™™™™ñ?éd   )Zbinsr   Úranger   Úr)r   g®Gáz®ï?)ÚyÚ_inch_to_relrE   F)Zhorizg      è?g      Ð?)ÚbottomÚtopÚleftÚrightZhspacegffffffæ?)rK   r)   r   rX   Úptpr¶   ÚTrÅ   Zravelr   rƒ   rÜ   rx   rv   rî   rm   ÚrejectÚhistZplotZget_ylimrí   rW   r]   r  Zsubplots_adjustrh   )r   r,   r@   r  rè   rû   rü   r|   rÇ   rê   rä   rÙ   rˆ   Z_ch_typerJ   rð   r  Ú_ranger   r   r   r   Ú_create_epoch_histogram  sT    ÿÿ ÿ"ýz#BrowserBase._create_epoch_histogramc                 C   s   dS )z9Look at _close_event in mne.fixes.py for why this exists.Nr   )r   rÙ   r   r   r   r×   0  s    zBrowserBase._close_eventc                 C   s   | j ||d�S )zãPass a fake keypress to the figure.

        Parameters
        ----------
        key : str
            The key to fake (e.g., ``'a'``).
        fig : instance of Figure
            The figure to pass the keypress to.
        rõ   )Ú_fake_keypress©r   r~   rÙ   r   r   r   Úfake_keypress4  s    
zBrowserBase.fake_keypressc                 C   s   d S r™   r   ro   r   r   r   rÖ   D  s    zBrowserBase._get_sizec                 C   s   d S r™   r   r  r   r   r   r  H  s    zBrowserBase._fake_keypressc                 C   s   d S r™   r   )r   ÚpointrÙ   r´   ZxformÚbuttonrë   r   r   r   Ú_fake_clickL  s    zBrowserBase._fake_clickc                 C   s   d S r™   r   )r   Zch_indexr  r   r   r   Ú_click_ch_nameP  s    zBrowserBase._click_ch_namec                 C   s   d S r™   r   )r   Úfactorr   r   r   Ú_resize_by_factorT  s    zBrowserBase._resize_by_factorc                 C   s   d S r™   r   )r   Zorientationr   r   r   Ú_get_ticklabelsX  s    zBrowserBase._get_ticklabelsc                 C   s   d S r™   r   ro   r   r   r   rš   \  s    z BrowserBase._update_yaxis_labels)NN)N)TF)N)&r    r!   r"   r#   r   rp   r�   r‡   rk   r‘   r˜   rœ   rj   rž   r°   r·   rÃ   rË   rÌ   r“   r›   rÚ   r   rÜ   rà   rÝ   rÞ   rß   r  r×   r  rÖ   r  r  r  r  r  rš   r   r   r   r   r$   &   sV   a
 ÿ
&


$
-






r$   c                 C   s:   | dkrt jddd�anddlma t d| › d�¡ tS )	NÚ
matplotlibz._mpl_figurezmne.viz)ÚnameÚpackager   )Ú
_pg_figurezUsing z as 2D backend.)Ú	importlibÚimport_moduleÚbackendÚmne_qt_browserr  r   ra   ©rI   r   r   r   Ú_load_backenda  s    ÿr  c              
   K   sv  ddl m} | d|ƒ ¡}|dks6t t |¡dk ¡r>d|d< | rFdnd|d	< | d
d¡dkrltddƒ|d
< | dd¡dkrŠtddƒ|d< tƒ }|dk�rXddl	}ddl
m} ddlm} | dd¡}	t| dd¡|ƒ}
||jddƒ}|	rîdnd}|�rX|	�s|
�rXt d|j› d|› d�¡ tdƒ�, tjf |Ž}t| ||d� |W  5 Q R £ S Q R X tjf |Ž}t| ||d� |S ) z*Instantiate a new MNE browse-style figure.r   )Ú_get_figsize_from_configrä   Nr9   )r9   r9   TFZsplashÚthemeZMNE_BROWSER_THEMEÚautoZoverview_modeZMNE_BROWSER_OVERVIEW_MODEZchannelsÚqtr   r   r%   )Ú_compare_versionr*   r)   ú<z0.2.0r(   ZEpochsz=You set the browser-backend to "qt" but your current version z" of mne-qt-browser is too low for z1.Update with pip or conda.Defaults to matplotlib.r  )rì   ÚblockrÙ   )r§   r   Ú
setdefaultrX   ÚanyrY   rL   r
   Úget_browser_backendr  rG   r&   Úfixesr$  rM   Ú__version__r   ra   Úuse_browser_backendr  Z_init_browserr   )rì   r&  r   r   rä   rI   r  r&   r$  Zis_icarT   Z
not_compatZinst_strrÙ   r   r   r   Ú_get_browsern  s<     ÿ

r-  c                 C   s4   t | tdƒ |  ¡ } | dkr dn| } td| tƒ | S )NrI   Z	pyqtgraphr#  )r   rÒ   ry   r   r   r  r   r   r   Ú_check_browser_backend_name™  s
    r.  c                 C   s$   t }t| ƒ} t | kr t| ƒ | a |S )uµ	  Set the 2D browser backend for MNE.

    The backend will be set as specified and operations will use
    that backend.

    Parameters
    ----------
    backend_name : str
        The 2D browser backend to select. See Notes for the capabilities
        of each backend (``'qt'``, ``'matplotlib'``). The ``'qt'`` browser
        requires `mne-qt-browser
        <https://github.com/mne-tools/mne-qt-browser>`__.
    %(verbose)s

    Returns
    -------
    old_backend_name : str | None
        The old backend that was in use.

    Notes
    -----
    This table shows the capabilities of each backend ("âœ“" for full support,
    and "-" for partial support):

    .. table::
       :widths: auto

       +--------------------------------------+------------+----+
       | **2D browser function:**             | matplotlib | qt |
       +======================================+============+====+
       | :func:`plot_raw`                     | âœ“          | âœ“  |
       +--------------------------------------+------------+----+
       | :func:`plot_epochs`                  | âœ“          | âœ“  |
       +--------------------------------------+------------+----+
       | :func:`plot_ica_sources`             | âœ“          | âœ“  |
       +--------------------------------------+------------+----+
       +--------------------------------------+------------+----+
       | **Feature:**                                           |
       +--------------------------------------+------------+----+
       | Show Events                          | âœ“          | âœ“  |
       +--------------------------------------+------------+----+
       | Add/Edit/Remove Annotations          | âœ“          | âœ“  |
       +--------------------------------------+------------+----+
       | Toggle Projections                   | âœ“          | âœ“  |
       +--------------------------------------+------------+----+
       | Butterfly Mode                       | âœ“          | âœ“  |
       +--------------------------------------+------------+----+
       | Selection Mode                       | âœ“          | âœ“  |
       +--------------------------------------+------------+----+
       | Smooth Scrolling                     |            | âœ“  |
       +--------------------------------------+------------+----+
       | Overview-Bar (with Z-Score-Mode)     |            | âœ“  |
       +--------------------------------------+------------+----+

    .. versionadded:: 0.24
    )ÚMNE_BROWSER_BACKENDr.  r  )rI   r	   Zold_backend_namer   r   r   Úset_browser_backend¡  s    ;r0  c                  C   s    t ptdd d�} | d k	r$t| ƒ t S tƒ }tD ]H}zt|ƒ W n. tk
rl } zt|ƒ||< W 5 d }~X Y q.X |a  q˜q.tdd 	dd„ | 
¡ D ƒ¡ ƒ‚t S d S )Nr/  )r~   Údefaultz%Could not load any valid 2D backend:
Ú
c                 s   s    | ]\}}|› d |› �V  qdS )z: Nr   )r0   r~   Úvalr   r   r   Ú	<genexpr>ü  s     z(_init_browser_backend.<locals>.<genexpr>)r/  r
   r0  r]   r   r  ÚImportErrorrÒ   ÚRuntimeErrorrÕ   rv   )Zloaded_backendÚerrorsr  Úexcr   r   r   Ú_init_browser_backendå  s(    
ÿÿÿr9  c               
   C   sD   z
t ƒ } W n4 tk
r> } zd} t t|ƒ¡ W 5 d}~X Y nX | S )zÄReturn the 2D backend currently used.

    Returns
    -------
    backend_used : str | None
        The 2D browser backend currently in use. If no backend is found,
        returns ``None``.
    N)r9  r6  r   ra   rÒ   )rI   r8  r   r   r   r)    s    	
 r)  c                 c   sD   t | ƒ}z
tV  W 5 |dk	r>zt |ƒ W n tk
r<   Y nX X dS )aH  Create a 2D browser visualization context using the designated backend.

    See :func:`mne.viz.set_browser_backend` for more details on the available
    2D browser backends and their capabilities.

    Parameters
    ----------
    backend_name : {'qt', 'matplotlib'}
        The 2D browser backend to use in the context.
    N)r0  Ú	Exceptionr  )rI   Zold_backendr   r   r   r,    s    
r,  )N)-r#   r  Úabcr   r   Úcollectionsr   Ú
contextlibr   rº   r   Ú	itertoolsr   ÚnumpyrX   rG   r	   r
   r   rc   r   Údefaultsr   r§   r   r   r   Zio.pickr   Zbackends._utilsr   r   r   r   r/  r  r   r$   r  r-  r.  r0  r9  r)  r,  r   r   r   r   Ú<module>   s>   	    ?+C