U
    f»{jž™ ã                   @   sô  d Z ddlZddlZddl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 ddlmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZmZmZmZmZ ddl m!Z!m"Z" ddl#m$Z$m%Z%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.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 dZ5e 6¡  eƒ Z7e 8¡  dZ9dZ:dZ;dZ<G dd„ deƒZ=G dd„ de=ƒZ>G dd„ de=ƒZ?G dd„ de+e=ƒZ@G d d!„ d!e=ƒZAd"d#„ ZBd$d%„ ZCd&e=fd'd(„Z*d5d)d*„ZDd+d,„ ZEd-d.„ ZFd/d0„ ZGed1d2„ ƒZHd3d4„ ZIdS )6u�  Figure classes for MNE-Python's 2D plots.

Class Hierarchy
---------------

MNEFigParams    Container object, attached to MNEFigure by default. Sets
                close_key='escape' plus whatever other key-value pairs are
                passed to its constructor.

matplotlib.figure.Figure
  â”” MNEFigure
     â”œ MNEBrowseFigure         Interactive figure for scrollable data.
     â”‚                         Generated by:
     â”‚                         - raw.plot()
     â”‚                         - epochs.plot()
     â”‚                         - ica.plot_sources(raw)
     â”‚                         - ica.plot_sources(epochs)
     â”‚
     â”œ MNEAnnotationFigure     GUI for adding annotations to Raw
     â”‚
     â”œ MNESelectionFigure      GUI for spatial channel selection. raw.plot()
     â”‚                         and epochs.plot() will generate one of these
     â”‚                         alongside an MNEBrowseFigure when
     â”‚                         group_by == 'selection' or 'position'
     â”‚
     â”” MNELineFigure           Interactive figure for non-scrollable data.
                               Generated by:
                               - raw.plot_psd()
                               - evoked.plot()        TODO Not yet implemented
                               - evoked.plot_white()  TODO Not yet implemented
                               - evoked.plot_joint()  TODO Not yet implemented
é    N)ÚOrderedDict)Úcontextmanager)Úpartial)Úget_backend)ÚFigureé   )Úchannel_indices_by_typeÚ
pick_types)Ú_sync_onset)Ú_handle_default)Ú_DATA_CH_TYPES_ORDER_DEFAULTÚ_DATA_CH_TYPES_SPLITÚ_FNIRS_CH_TYPES_SPLITÚ_VALID_CHANNEL_TYPESÚ_picks_to_idx)Úpsd_multitaperÚ	psd_welch)ÚBunchÚ_check_optionÚ_check_sphereÚ_click_ch_nameÚloggeré   )Úplot_sensors)ÚBrowserBase)	ÚDraggableLineÚ_events_offÚ_fake_clickÚ_merge_annotationsÚ	_plot_psdÚ_prop_kwÚ_set_window_titleÚ_validate_if_list_of_axesÚplt_showÚ
matplotlibçš™™™™™¹?g333333@ç      @ç      à?c                       sj   e Zd ZdZ‡ f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d„Z‡  ZS )Ú	MNEFigurezDBase class for 2D figures & dialogs; wraps matplotlib.figure.Figure.c                    s®   ddl m} | dd ¡}tƒ j|d� t|d |d d�}| ¡ D ]\}}||krB|||< qBtˆ dƒs€dd	lm	} |f |Žˆ _
n*‡ fd
d„|D ƒD ]}tˆ j
||| ƒ q’d S )Nr   )ÚrcParamsÚfigsize)r*   zaxes.edgecolorzaxes.facecolor)ÚfgcolorÚbgcolorÚmne)ÚBrowserParamsc                    s   g | ]}t ˆ j|ƒs|‘qS © )Úhasattrr-   ©Ú.0Úk©Úselfr/   úR/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/viz/_mpl_figure.pyÚ
<listcomp>g   s      z&MNEFigure.__init__.<locals>.<listcomp>)r$   r)   ÚpopÚsuperÚ__init__ÚdictÚitemsr0   Zmne.viz._figurer.   r-   Úsetattr)r5   Úkwargsr)   r*   ÚdefaultsÚkeyÚvaluer.   ©Ú	__class__r4   r6   r:   U   s    ÿ

zMNEFigure.__init__c                 C   sh   t  d| ›�¡ t| jddƒdk	}t| jddƒdk	}|rd| jjjj | ¡ |rdt| jjj| jjdƒ dS )úHandle close events.zClosing Ú
parent_figNÚfig_name)	r   ÚdebugÚgetattrr-   rE   Ú
child_figsÚremover=   rF   )r5   ÚeventZis_childZis_namedr/   r/   r6   Ú_closej   s    zMNEFigure._closec                 C   s4   |j | jjkrt | ¡ n|j dkr0| jj ¡  dS )úHandle keypress events.Zf11N)r@   r-   Ú	close_keyÚpltÚcloseÚcanvasÚmanagerZfull_screen_toggle©r5   rK   r/   r/   r6   Ú	_keypressu   s    
zMNEFigure._keypressc                 C   s   dS )zHandle buttonpress events.Nr/   rS   r/   r/   r6   Ú_buttonpress|   s    zMNEFigure._buttonpressc                 C   s   dS )úHandle matplotlib pick events.Nr/   rS   r/   r/   r6   Ú_pick€   s    zMNEFigure._pickc                 C   s   dS )zHandle window resize events.Nr/   rS   r/   r/   r6   Ú_resize„   s    zMNEFigure._resizec                 K   sŠ   t | jjj di ¡ƒ}|D ]}| jj |¡ qt| j| j| j| j	| j
d�}| |¡ tƒ }| ¡ D ]\}}| j ||¡||< qb|| j_dS )zARemove some matplotlib default callbacks and add MNE-Python ones.Úkey_press_event)Zresize_eventrY   Úbutton_press_eventZclose_eventZ
pick_eventN)ÚlistrQ   Ú	callbacksÚgetÚ
disconnectr;   rX   rT   rU   rL   rW   Úupdater<   Úmpl_connectr-   Ú_callback_ids)r5   r>   Zdefault_callbacksÚcallbackr\   Zcallback_idsrK   r/   r/   r6   Ú_add_default_callbacksˆ   s     ÿü
z MNEFigure._add_default_callbacksc                 C   s    d}dD ]}t | j||ƒ}q|S )z)Get DPI ratio (to handle hi-DPI screens).ç      ð?)Z
_dpi_ratioZ_device_scale)rH   rQ   )r5   Ú	dpi_ratior@   r/   r/   r6   Ú_get_dpi_ratioœ   s    zMNEFigure._get_dpi_ratioc                 C   s   |   ¡ }|  ¡ | j | S )zGet figure size in pixels.)rf   Úget_size_inchesZdpi)r5   re   r/   r/   r6   Ú_get_size_px£   s    zMNEFigure._get_size_pxTc                 C   s    |   ¡ \}}|r|n|}|| S )z,Convert inches to figure-relative distances.©rg   )r5   Z
dim_inchesÚhorizZfig_wZfig_hZw_or_hr/   r/   r6   Ú_inch_to_rel¨   s    zMNEFigure._inch_to_rel)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r:   rL   rT   rU   rW   rX   rc   rf   rh   rk   Ú__classcell__r/   r/   rB   r6   r(   R   s   r(   c                       s@   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Z‡  Z	S )ÚMNEAnnotationFigurez*Interactive dialog figure for annotations.c                    sF   | j j}d|j jj_| ¡  |j jd }|jj 	|¡ t
ƒ  |¡ dS )z1Handle close events (via keypress or window [x]).FÚmotion_notify_eventN)r-   rE   Úax_mainÚselectorÚactiveÚ_remove_annotation_hover_linera   rQ   r\   r^   r9   rL   )r5   rK   ÚparentZcallback_idrB   r/   r6   rL   ²   s    zMNEAnnotationFigure._closec                 C   s’   | j  ¡ }|j}|| jjkr(t | ¡ nP|dkr>|dd… }n:|dkrX| jj |¡ dS t	|ƒdksl|dkrpdS || }| j  
|¡ | j ¡  dS )rM   Z	backspaceNéÿÿÿÿZenterr   ú;)ÚlabelÚget_textr@   r-   rN   rO   rP   rE   Ú_add_annotation_labelÚlenÚset_textrQ   Údraw)r5   rK   Útextr@   r/   r/   r6   rT   ¿   s    
zMNEAnnotationFigure._keypressc                 C   sº   | j jj}dd„ |jD ƒ}| |j¡}|  |¡ |j|  ¡ }| j j	j j
j}z|j||d� W nV tk
r´   tjdd��0 t dt¡ |j |¡ |j t|d�¡ W 5 Q R X Y nX dS )	z9Handle Radiobutton clicks for Annotation label selection.c                 S   s   g | ]}|  ¡ ‘qS r/   ©r{   ©r2   rz   r/   r/   r6   r7   Õ   s     z3MNEAnnotationFigure._radiopress.<locals>.<listcomp>)ÚcolorÚ	facecolorT)ÚrecordÚignore)r„   N)r-   Úradio_axÚbuttonsÚlabelsÚindexÚvalue_selectedÚ_set_active_buttonÚcirclesÚget_edgecolorrE   rs   rt   Z	set_propsÚAttributeErrorÚwarningsÚcatch_warningsÚsimplefilterÚDeprecationWarningÚrectÚ	set_colorZ	rectpropsr_   r;   )r5   rK   rˆ   r‰   Úidxrƒ   rt   r/   r/   r6   Ú_radiopressÑ   s    

zMNEAnnotationFigure._radiopressc           
      C   sÖ   | j j}|j}| |¡s,|jdks,|j|kr0dS |j ¡  |j	|j
f¡}i }tt|j|jƒƒD ]N\}\}}| ¡  |j	|j
¡s–tj ||j ¡|jk r^tj ||j ¡||< q^t|ƒdkrÒt||jd�}	| |	¡ dS )z9Override MPL radiobutton click detector to use transData.r   Nr   )r@   )r-   r‡   rˆ   r†   ÚbuttonÚinaxesÚ	transDataÚinvertedÚ	transformÚxÚyÚ	enumerateÚzipr�   r‰   Zget_window_extentÚcontainsÚnpZlinalgZnormÚcenterÚradiusr}   Úminr]   Ú
set_active)
r5   rK   Úaxrˆ   ZpclickedZ	distancesÚiÚpÚtZclosestr/   r/   r6   Ú_click_overrideå   s    ÿz#MNEAnnotationFigure._click_overridec              	   C   s~   | j jj}t|ƒ� | |¡ W 5 Q R X |jD ]}| | j jj j¡ q.t	|j|  
¡ ƒ}d|d< |j|  |¡ | j ¡  dS )z.Set active button in annotation dialog figure.r'   rx   N)r-   r‡   rˆ   r   r¦   r�   Úset_facecolorrE   r,   r[   rŽ   rQ   r   )r5   r–   rˆ   Úcirclerƒ   r/   r/   r6   rŒ   õ   s    


z&MNEAnnotationFigure._set_active_button)
rl   rm   rn   ro   rL   rT   r—   r«   rŒ   rp   r/   r/   rB   r6   rq   ¯   s   rq   c                       s@   e Zd ZdZdd„ Z‡ fdd„Zdd„ Zdd	„ Zd
d„ Z‡  Z	S )ÚMNESelectionFigurez1Interactive dialog figure for channel selections.c                 C   s,   | j jj j | ¡ d| j _t | j j¡ dS )rD   N)r-   rE   rI   rJ   Úfig_selectionrO   rP   rS   r/   r/   r6   rL     s    zMNESelectionFigure._closec                    s*   |j dkr| jj |¡ ntƒ  |¡ dS )rM   )ÚupÚdownÚbN)r@   r-   rE   rT   r9   rS   rB   r/   r6   rT     s    
zMNESelectionFigure._keypressc              	   C   s®   | j jj j}| j jj}dd„ |jD ƒ}|j}| j j}|dkrnt|d ƒsnt|ƒ� | 	| j j
¡ W 5 Q R X dS |j jr¢| ¡  t|ƒ� | 	| |¡¡ W 5 Q R X | ¡  dS )z7Handle RadioButton clicks for channel selection groups.c                 S   s   g | ]}|  ¡ ‘qS r/   r�   r‚   r/   r/   r6   r7     s     z2MNESelectionFigure._radiopress.<locals>.<listcomp>ÚCustomN)r-   rE   Úch_selectionsr‡   rˆ   r‰   r‹   r}   r   r¦   Úold_selectionÚ	butterflyÚ_toggle_butterflyrŠ   Ú_update_selection)r5   rK   Úselections_dictrˆ   r‰   Z
this_labelrw   r/   r/   r6   r—     s    


zMNESelectionFigure._radiopressc                 C   sn   | j j}| jj}| jjj}t|ƒs&dS dd„ |jD ƒ}t 	|jj
|¡}| ¡ d |jjd< | | d¡¡ dS )z'Set custom selection by lasso selector.Nc                 S   s   g | ]}|  ¡ ‘qS r/   r�   r‚   r/   r/   r6   r7   -  s     z<MNESelectionFigure._set_custom_selection.<locals>.<listcomp>r   r³   )ÚlassoÚ	selectionr-   rE   r‡   rˆ   r}   r‰   r¢   Úin1dÚch_namesÚnonzeror´   r¦   rŠ   )r5   Zchsrw   rˆ   r‰   Úindsr/   r/   r6   Ú_set_custom_selection&  s    
z(MNESelectionFigure._set_custom_selectionc              	   C   st   | j j}| j jj}|j jr |jn|j j}|jD ]}| |¡ q.|j jsht	|ƒ� | 
| j j¡ W 5 Q R X | ¡  dS )z3Handle RadioButton state for keyboard interactions.N)r-   rE   r‡   rˆ   r¶   Úactivecolorr,   r�   r¬   r   r¦   rµ   Ú_update_highlighted_sensors)r5   rw   rˆ   rƒ   r­   r/   r/   r6   Ú_style_radio_buttons_butterfly2  s    
ÿ

z1MNESelectionFigure._style_radio_buttons_butterfly)
rl   rm   rn   ro   rL   rT   r—   rÀ   rÃ   rp   r/   r/   rB   r6   r®     s   r®   c                       s<  e Zd ZdZdŠdd„Zdd„ Zdd	„ Zd
d„ Z‡ fdd„Zdd„ Z	dd„ Z
‡ f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d(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d‹d@dA„Z"dŒdCdD„Z#dEdF„ Z$‡ fdGdH„Z%‡ fdIdJ„Z&dKdL„ Z'dMdN„ Z(dOdP„ Z)dQdR„ Z*dSdT„ Z+dUdV„ Z,dWdX„ Z-dYdZ„ Z.d[d\„ Z/d]d^„ Z0d_d`„ Z1d�dbdc„Z2ddde„ Z3dfdg„ Z4dhdi„ Z5djdk„ Z6dŽ‡ fdmdn„	Z7dodp„ Z8dqdr„ Z9dsdt„ Z:dudv„ Z;d�dwdx„Z<d�dydz„Z=d‘d~d„Z>d’d€d�„Z?d‚dƒ„ Z@d“d„d…„ZAd†d‡„ ZBdˆd‰„ ZC‡  ZDS )”ÚMNEBrowseFigurez6Interactive figure with scrollbars, for data browsing.NúTime (s)c           :         sò  ddl m} ddlm} ddlm}m}	m}
m} ddl	m
} ddlm} ddlm} ddlm} d	ˆ _| ||||d
œ¡ tjˆ f|Ž tjˆ f|Ž d}d}d}d}d}d}d}|d }ˆ  || | ¡}dˆ  |¡ }ˆ j|dd�}dˆ j|dd� }|| }|| }||||g}ˆ jddd|d�}ˆ jj||||d� ||ƒ} | |¡ˆ j_ˆ jj ˆ jj ¡ d|k�r~| |d ¡ | jd||ƒ||ƒd�}!| jd||ƒ||ƒd�}"|!  ¡  d¡ |! |¡ |" !¡  ˆ jj"�r8ˆ jj#j$}#t%|#ƒD ]T\}$}%ˆ jj&|$ }&t' (ˆ jj&d d… ¡d }|! )||&df|ddˆ jj*d d�¡ �qê||!fD ]0}'|'j+ ,|	ˆ jj&dd… ƒ¡ |'j+ -|ƒ ¡ �qHt.ˆ jj/dˆ jj*d d�}(|j0f dd d!œ|(—Ž |!j0f d"d"d#d$œ|(—Ž |j+ 1|	ˆ jj2ƒ¡ |j+ 3||#ƒ¡ |!j+ 1|	ˆ jj2d%d&�¡ |!j+ 3|
‡ fd'd(„ƒ¡ |j4dd)dd*� |!j4dd+dd*� n\|j+ -|
t5ˆ j6d,d-�ƒ¡ |!j+ -|
t5ˆ j6d.d-�ƒ¡ ˆ jj7d/k�r”||!fD ]}'|' d0¡ �q‚ˆ jj8})t%|)ƒD ]t\}$}*ˆ jj9|* ˆ jj:d1 k�rÎˆ jj;nˆ jj<}+t=|+t.ƒ�rò|+ˆ jj>|*  }+|" )|d|$fdd|+ˆ jj*d d�¡ �q¤|" ?t@|)ƒd¡ |" ˆ jjA ¡ t.d2d3dˆ jj/d4�},|d5dˆ jjBfd6ˆ jjCi|,—Ž}-|" )|-¡ t'jDt' E|ˆ jj/ƒ|ˆ jjCƒf¡dd7d8�}.|ˆ jjFdfˆ jjGdfd6|.i|,—Ž}/|! )|/¡ |! Hˆ jjIˆ jjIˆ jjJˆ jj:d9   ¡ d:}0t.dˆ jj*d; d<�}1ˆ jj"�r\t' Kˆ jjL¡}2|jM|2ddfd=|0i|1—Ž}3|3 N||jO|jPƒ¡ d }4n(|jQdMd>|0i|1—Ž}3|!jQdNd>|0i|1—Ž}4|jRdOd5d@dAdBdCddD|0dEœ|1—Ž}5| jdF||ƒ||ƒd�}6| jSdddG�}7|6 T|7¡ tU|6jVƒ� ||6dHƒˆ j_WW 5 Q R X d }8t@ˆ jjXƒ�r’ˆ jj#jY�s’dˆ  || ¡ ˆ j|dd�ˆ  |¡ˆ j|dd�g}9| jSd3ddG�}7ˆ  Z|9¡}8|8 T|7¡ tU|6jVƒ� ||8dIƒˆ j_[W 5 Q R X t.dJd"dK�ˆ j_\|j]t' ^dˆ jjBft'j_¡fˆ jj\Žˆ j_`taˆ jƒj||6|8|!|"|-|/|3|4|5dL�
 d S )PNr   ©Úto_rgba_array©Ú	Rectangle)ÚFixedFormatterÚFixedLocatorÚFuncFormatterÚNullFormatter)Úblended_transform_factory)ÚButton©Úmake_axes_locatable©ÚFixedr$   )Úinstr*   ÚicaÚxlabelrd   r%   çÍÌÌÌÌÌÜ?ç      Ð?r   r   F©rj   )Úposition)ÚleftÚbottomÚtopÚrightr,   rÜ   ©rÚ   ÚsizeÚpadrÞ   ÚnoneÚpatch©rƒ   Úzorderrx   r�   Úgrid)rƒ   Úaxisrå   Zdashed)Ú	linewidthÚ	linestyler'   Zsolid)Úalpharè   ré   é   )Znbinsc                    s
   ˆ   | ¡S ©N)Z_get_epoch_num_from_time)r�   Úposr4   r/   r6   Ú<lambda>�  ó    z*MNEBrowseFigure.__init__.<locals>.<lambda>Úmajor)rç   ÚwhichrÜ   ZbothÚmain©Úax_typeÚhscrollÚfloatúTime (HH:MM:SS)Úbadsç333333Ó?é   )rê   rè   Zclip_onZ	edgecolor)r   r   r„   )é   r   )rç   ÚweightsÚsfreq)ç        g      è?rþ   Úvline)Úvisiblerå   Úcolorsrƒ   Ú zaxes fraction)éþÿÿÿr   úoffset pointsé
   r£   )ÚxyZxycoordsÚxytextÚ
textcoordsÚfontsizeÚhaÚvarƒ   rÛ   )ÚnxÚnyÚHelpZPrjT)Zantialiasedrè   )
rs   Úax_helpÚax_projÚ
ax_hscrollÚ
ax_vscrollÚ
vsel_patchÚ
hsel_patchrÿ   Úvline_hscrollÚ
vline_text)r   )r   )r  )bÚmatplotlib.colorsrÇ   Úmatplotlib.patchesrÉ   Zmatplotlib.tickerrÊ   rË   rÌ   rÍ   Zmatplotlib.transformsrÎ   Úmatplotlib.widgetsrÏ   Ú$mpl_toolkits.axes_grid1.axes_dividerrÑ   Ú!mpl_toolkits.axes_grid1.axes_sizerÓ   Úbackend_namer_   r   r:   r(   rk   Úadd_subplotÚsubplotparsÚ
set_xlabelr-   Ú
zen_xlabelÚset_visibleÚscrollbars_visibler¬   Úappend_axesZ	get_yaxisÚset_axis_offÚ	is_epochsrÔ   r»   rŸ   Úboundary_timesr¢   ÚdiffZ	add_patchrå   ZxaxisZset_major_locatorZset_major_formatterr;   r+   ræ   Zset_minor_locatorZ	midpointsZset_minor_formatterZtick_paramsr   Ú_xtick_formatterÚtime_formatÚch_orderr½   ÚinfoÚch_color_badÚch_color_dictÚ
isinstanceÚch_typesÚset_ylimr}   r¶   Ú
n_channelsr,   ÚaverageÚvstackÚt_startÚdurationÚset_xlimÚ
first_timeÚn_timesÚarangeÚn_epochsZvlinesÚset_transformrš   Ú	transAxesZaxvlineÚannotateZnew_locatorZset_axes_locatorÚ_patched_canvasÚfigureZbutton_helpÚprojsÚprojÚadd_axesZbutton_projÚtrace_kwargsÚplotÚfullÚnanÚtracesÚvars):r5   rÔ   r*   rÕ   rÖ   r>   rÇ   rÉ   rÊ   rË   rÌ   rÍ   rÎ   rÏ   rÑ   rÓ   Úl_marginÚr_marginÚb_marginÚt_marginZscroll_widthZhscroll_distZvscroll_distÚ
help_widthrÛ   rÞ   rÜ   rÝ   ÚwidthÚheightrÚ   rs   Údivr  r  Ú
epoch_numsÚixÚ_ÚstartÚ_axZgrid_kwargsr*  ÚpickZ
this_colorZ
sel_kwargsr  Zhsel_facecolorr  Zvline_colorZvline_kwargsr�   rÿ   r  r  r  Úlocr  Zproj_button_posr/   r4   r6   r:   F  sœ   ý
þþ



ÿÿÿ

ÿÿÿÿÿÿÿÿÿþ
ÿÿÿÿÿ

ÿ ýÿÿ
ÿ
  ÿÿÿ
ÿÿ ÿ     ýýþ
ü

ÿÿ
      üzMNEBrowseFigure.__init__c                 C   s   |   ¡ S rì   ri   r4   r/   r/   r6   Ú	_get_size  s    zMNEBrowseFigure._get_sizec                 C   sv   | j j\}}|  ¡ \}}t| ||||ƒ}| jf |Ž | j  j|| 9  _| j  j|| 9  _||f| j _| j ¡  dS )z@Handle resize event for mne_browse-style plots (Raw/Epochs/ICA).N)	r-   Úfig_size_pxrh   Ú_calc_new_marginsÚsubplots_adjustÚzen_wÚzen_hrQ   Ú	draw_idle©r5   rK   Ú	old_widthÚ
old_heightÚ	new_widthÚ
new_heightÚnew_marginsr/   r/   r6   rX     s        ÿzMNEBrowseFigure._resizec                    sÖ  |j dk	s"|jdks"|j| jjkr&dS | jjs:|  ¡  dS ddlm}m	} | jj
D �]t}| |¡d rR| ¡ ‰tˆƒdks~t‚ˆd ‰| ¡ d }| jj ¡ }ˆjdd…df  ¡ }ˆjdd…df  ¡ }t|j| ƒt|j| ƒk rê|n|}	ˆjdd…df |	k‰ ‡ ‡fdd„}
| jj}|dk�rT| jjj|	|	g||ddd	�d }t|| j|
ƒ}n| |	¡ |
|_|j}|d
|dd�|ƒ g}| | |¡d �r–|n
|dd… ¡ d| jjj_|| j_| j  ¡   dS qR|  ¡  dS )z$Handle motion event when annotating.Nr   )ÚNormalÚStroker   c                    s   | ˆj ˆ df< d S )Nr   )Úvertices)Zx0©ÚmaskÚpathr/   r6   Údrag_callback'  s    z-MNEBrowseFigure._hover.<locals>.drag_callbackr   r&   )rƒ   rè   Z
pickradiusrú   r'   )rè   Ú
foregroundrê   F)!r˜   Úxdatar™   r-   rs   Údraggable_annotationsrv   Zmatplotlib.patheffectsre  rf  Úannotationsr¡   Ú	get_pathsr}   ÚAssertionErrorZget_edgecolorsÚget_ylimrg  r¥   ÚmaxÚabsÚannotation_hover_linerD  r   Ú_modify_annotationZset_xrk  ÚlineZset_path_effectsrt   ru   rQ   r^  )r5   rK   re  rf  Zcollrƒ   ÚylimZ_lÚ_rr�   rk  Z
hover_linerw  Zpatheffr/   rh  r6   Ú_hover  s^    ÿ$
 ÿÿ  ÿ
ÿ
ÿ
zMNEBrowseFigure._hoverc              	      s
  |j }| jj}| jjr,| jj| jjd  }n| jjjd }|dk�rž| d¡d }|dkr^dnd}| jj	rndS | jj
dk	�rP| jj
jjj}dd	„ |jD ƒ}|j}| |¡}	| jj}
|	t|ƒd k }|	t|ƒd
 k }|
 dd¡dk	}t|
 dtƒ ¡ƒ}|dk�o|	dk}|dk�o2|�p2|�r$| �p2|�o2|�o2|}|�s@|�rš| |	| ¡ nJt| jjƒ| }| jj||  }t |d|¡| j_|  ¡  |  ¡  |  ¡  �nh|dk�r\| jj}| d¡�rÀdnd}| jj�rè| d¡�rÞdn| jj}n| d¡�rødnd}|| jj  }| jj|| jj  |  }t || jj!|¡| j_| jj|k�r|  "¡  | jdd� �nª|dk�r˜|dk�rtdnd}| j j#|9  _#| jdd� �nn|dk�r`| jj
dk�r`| jj	�s`||dk�rÊdnd }t |dt| jjƒ¡| j_| jj| jj }|t| jjƒk�r2| jjdk�r2| j jd8  _|  ¡  | jj|k�r|  ¡  |  $¡  | jdd� �n¦|dk�rx| jj }|dk�r€dnd}| jj�rÜt | jj| dt| jjƒ¡| j_t| jjjƒ| jjd  }| jj ||  }n>dt %| jjjdd
… ¡d  }|dk�r
dnd }| jj | }t |||¡| j_ | jj |k�r| jj| jj  |k�r`|| jj  | j_|  "¡  | jdd� �nŽ|d!k�r�|  &|¡ �nv|d"k�r¦|  '¡  �n`|d#k�rÊ| jj(d$k�rÊ|  )¡  �n<|d%k�rî| jj* | j_*|  ¡  �n|d&k�r|  +¡  �n|d'k�r&t| jj,ƒ�r&|  -¡  nà|d(k�rNt| jj,ƒ�rN| j.|dd)� n¸|d*k�rœ|  /|¡ | jj0dk	�r| jj0jj1}t2|ƒ� | d¡ W 5 Q R X nj|d+k�r²|  3|¡ nT|d,k�rÆ|  4¡  n@|d-k�ræ|  5¡  | jdd� n |d.k�rú|  6¡  nt7ƒ  8|¡ dS )/rM   rý   rx   )r±   r°   z
shift+downzshift+upú+r°   r   Nc                 S   s   g | ]}|  ¡ ‘qS r/   r�   r‚   r/   r/   r6   r7   R  s     z-MNEBrowseFigure._keypress.<locals>.<listcomp>r   r³   r   r±   )rÞ   rÛ   zshift+rightz
shift+leftrÞ   Úshiftrú   T©ro  )ú=r{  ú-r  g]tÑEí?gš™™™™™ñ?F©Úupdate_data)ÚpageupZpagedownr‚  )ÚhomeÚendr„  rû   g      ô?çš™™™™™é?ú?Úar²   rÕ   ÚdÚhÚjÚJ©Ú
toggle_allr©   ÚsÚwÚzrª   )9r@   r-   r1  r%  r8  r+  rÔ   ÚtimesÚsplitr¶   r¯   r‡   rˆ   r‰   r‹   rŠ   r´   r}   r]   r[   r¦   r*  Úch_startr¢   ÚclipÚ_update_picksÚ_update_vscrollÚ_redrawr4  ÚendswithÚ
startswithr:  r5  r7  Ú_update_hscrollÚscale_factorÚ_update_trace_offsetsr'  Ú_toggle_help_figÚ_toggle_annotation_figÚinstance_typer·   Z	remove_dcÚ_toggle_epoch_histogramr@  Ú_toggle_proj_figÚ_toggle_proj_checkboxÚ_toggle_draggable_annotationsÚfig_annotationÚdrag_checkboxr   Ú_toggle_scalebarsZ_toggle_whiteningÚ_toggle_scrollbarsÚ_toggle_time_formatr9   rT   )r5   rK   r@   r1  Z	last_timeÚ	directionrˆ   r‰   Zcurrent_labelZcurrent_idxr¹   ZpenultZ
pre_penultZ
has_customZ
def_customZup_okZdown_okZceilingr“  Zold_t_startÚdenomZt_maxr4  ÚscalerZnew_n_chZch_endZold_durZ	dur_deltaZmin_durZnew_durÚcheckboxrB   r/   r6   rT   @  sè    



ÿý




ÿþ 

 
ÿ 













zMNEBrowseFigure._keypressc                    sZ  | j j}| j jdk	}| j j}| j j}ˆ jdks8ˆ jdkr<dS ˆ jdk�r€ˆ j|krÞ|sÞ| j jdksf|sÀ| j j| j j	 D ]H}| 
ˆ ¡d rv| j jdkr |  ˆ ¡ n| j j |¡}|  |¡  dS qv|  ˆ j¡ | jddd� dS ˆ j| j jk�r| j jdk	�r|  ˆ ¡ n|  ˆ ¡�r~|  ¡  n`ˆ j| j jk�rH|  ˆ ¡�r~| jdd	� n6ˆ j| j jk�rd|  ˆ ¡ nˆ j| j jk�rV|  ˆ ¡ nÖ|�r@t‡ fd
d„|jD ƒƒ�r$ˆ j| j j }t||jj ƒ}	|	|jj! }
t" #||	k||
k @ ¡d }t$|ƒddd… D ].}|j| d }| j j%| �rô|j &|¡ �qô|  '¡  |  (¡  | j) *¡  nˆ j|k�rV|  +d¡ dS )zHandle mouse clicks.N)r   rû   r   Úepochsr   F©r�  ro  Tr}  c                 3   s   | ]}|  ˆ ¡d  V  qdS )r   N)r¡   )r2   Úc©rK   r/   r6   Ú	<genexpr>î  s     z/MNEBrowseFigure._buttonpress.<locals>.<genexpr>rx   Údescription),r-   r¶   r¤  rs   rÔ   r˜   r™   rŸ  rG  Úepoch_tracesr¡   Ú_toggle_bad_epochrŠ   Ú_toggle_bad_channelÚ_show_vlinerm  r—  r  r¯   Ú_change_selection_vscrollÚ_check_update_vscroll_clickedr  Ú_check_update_hscroll_clickedr  r¡  r  r�  ÚanyÚcollectionsr7  r
   ro  Úonsetr5  r¢   ÚwhereÚsortedÚvisible_annotationsÚdeleterv   Ú_draw_annotationsrQ   r^  Ú_toggle_vline)r5   rK   r¶   Z
annotatingrs   rÔ   rw  r–   rm  rT  r„  Úann_idxÚdescrr/   r°  r6   rU   Ä  s\    

zMNEBrowseFigure._buttonpressc                 C   sz   ddl m} | jjrdS t|j|ƒrv|j ¡ }| jj| jj  	¡  
|¡}|jjdkr`|  |¡ n|jjdkrv|  |¡ dS )rV   r   )ÚTextNr   rû   )Zmatplotlib.textrÅ  r-   r¶   r.  Úartistr{   r½   ÚpicksÚtolistrŠ   Z
mouseeventr˜   rµ  Ú_create_ch_context_fig)r5   rK   rÅ  Zch_nameÚindr/   r/   r6   rW   þ  s    
zMNEBrowseFigure._pickc                    s   t ƒ  |¡}t|d� d S )N©Úfig)r9   rÉ  r#   )r5   r–   rÌ  rB   r/   r6   rÉ    s    z&MNEBrowseFigure._create_ch_context_figc                 K   sH   t f d| |dœ|—Ž}| ¡  | jj |¡ t|tƒrDt| j||ƒ |S )z;Instantiate a new MNE dialog figure (with event listeners).F)ÚtoolbarrE   rF   )Ú_figurerc   r-   rI   Úappendr.  Ústrr=   )r5   rF   r>   rÌ  r/   r/   r6   Ú_new_child_figure  s    ÿ
z!MNEBrowseFigure._new_child_figurec                 C   sT  dd„ |   ¡  ¡ D ƒ}d}d}| ¡ D ]n\}}| d¡r<dnd}| d¡rV|dd… n|}dt| d¡ƒ }||› |› d|› �7 }||› |› d�7 }q&t| d¡ƒ}td	d
„ | ¡ D ƒƒ}	tdd
„ | ¡ D ƒƒ}
|	|
 d }|d }| j||fddd�}| 	d¡}| 
¡  tdddd�}|jdd|fdddœ|—Ž |jdd|fdddœ|—Ž dS )zCreate help dialog window.c                 S   s   i | ]\}}|d k	r||“qS rì   r/   )r2   r@   Úvalr/   r/   r6   Ú
<dictcomp>   s    ÿ z4MNEBrowseFigure._create_help_fig.<locals>.<dictcomp>r  rS  Ú
r   Nz      c                 s   s   | ]}t |ƒV  qd S rì   ©r}   r1   r/   r/   r6   r±  ,  s     z3MNEBrowseFigure._create_help_fig.<locals>.<genexpr>c                 s   s6   | ].}d |kr&t dd„ | d ¡D ƒƒnt|ƒV  qdS )rÔ  c                 s   s   | ]}t |ƒV  qd S rì   rÕ  )r2   r�  r/   r/   r6   r±  -  s     z=MNEBrowseFigure._create_help_fig.<locals>.<genexpr>.<genexpr>N)rs  r’  r}   )r2   Úvr/   r/   r6   r±  -  s   ÿ é   é   Úfig_helpr  ©r*   rF   Úwindow_title)ç{®Gáz„?rÜ  ç\�Âõ(\ï?rÝ  rÝ   ç      ø?F)r  ÚlinespacingÚusetexgáz®GáÚ?rÞ   )Úmar
  rÛ   )Ú_get_help_textr<   r™  r}   r’  rs  ÚkeysÚvaluesrÑ  rB  r$  r;   r€   )r5   r€   rã  Úvalsr@   rÒ  Z
newsectionÚnewlinesZn_linesZlongest_keyZlongest_valrN  rO  rÌ  r§   r>   r/   r/   r6   Ú_create_help_fig  s2    ÿ
þ
z MNEBrowseFigure._create_help_figc                 C   s6   | j jdkr$|  ¡  t| j jd� nt | j j¡ dS )z!Show/hide the help dialog window.NrË  )r-   rÙ  rç  r#   rO   rP   rS   r/   r/   r6   r�  ;  s    z MNEBrowseFigure._toggle_help_figc              $      sZ  | j j}|dk}|dk}|dk}tt| j jƒƒ}t ¡ dk}|rDdnd}|rPdnd}|r\d	nd
‰ |rhdnd
}	d}
| j jr†dd„ dD ƒndd„ dD ƒ}‡ fdd„dD ƒ}|r®|
nd|	› �}|rÀ|
nd}tdddd�| }|rÞdnd}| j j	dkròdnd}| j j�rdnd}t
dd d!|› d"�fd#d!|› d$�f|d% |d% f|d& |d& fd'd(ˆ › d)�fd*d+ˆ › d)�f|d% |d% f|d& |d& fd,d-d.d/|�sŽd0ndfd1|�ržd2ndfd3|fd4d5|�r¶d6ndfd7|�rÆd8ndfd9|�rÖd:ndfd;d<|�rèd=ndfd>|�sød?ndfd@dA|�s
dBndfdC|�sdDndfdEdFdGdHˆ › dI�|fdHˆ › dJ�|fdK|fdLdMdN|fg"ƒ}|S )Oz?Generate help dialog text; `None`-valued entries removed later.Úrawr­  rÕ   ÚDarwin)u   fn + â†�u   fn + â†’)ZHomeZEnd)u   fn + â†‘u   fn + â†“)zPage upz	Page downÚ	componentZchannelÚepochz#Mark/unmark component for exclusionc                 S   s   g | ]}d |› d�‘qS )úShow z epochsr/   ©r2   Únr/   r/   r6   r7   R  s     z2MNEBrowseFigure._get_help_text.<locals>.<listcomp>)ZfewerÚmorec                 S   s   g | ]}d |› d�‘qS )rì  z time windowr/   )r2   rˆ  r/   r/   r6   r7   T  s     )ZshorterZlongerc                    s   g | ]}|› d ˆ › d�‘qS )z number of visible rŽ  r/   )r2   Zinc_dec©Zch_cmpr/   r6   r7   U  s     )ZIncreaseZDecreasezMark/unmark bad zMark/unmark bad channelzShow diagnostics for componentzShow imageplot for channelzShow channel location)rÕ   r­  rè  z#add annotation (in annotation mode)NzToggle signal whiteningz1 epochu	   Â¼ window)Z_NAVIGATIONú u   â†’zScroll u,    right (scroll full window with Shift + â†’)u   â†�u+    left (scroll full window with Shift + â†�)r   r   u   â†‘zScroll up (zs)u   â†“zScroll down ()z_SIGNAL TRANSFORMATIONSrñ  )z+ or =zIncrease signal scaling)r  zDecrease signal scalingr²   zToggle butterfly moderˆ  zToggle DC removalr�  )z_USER INTERFACErñ  r‡  zToggle annotation moder‰  zToggle peak-to-peak histogramrŠ  zToggle SSP projector window)zshift+jzToggle all SSPsr©   zToggle draggable annotationsrŽ  zToggle scalebars)r�  zToggle scrollbarsrª   zToggle time formatZF11zToggle fullscreen)r†  zOpen this help window)Úescz%Close focused figure or dialog window)z_MOUSE INTERACTIONrñ  zLeft-click z namez datazLeft-click-and-drag on plot)zLeft-click on plot backgroundzPlace vertical guide)zRight-click on plot backgroundzClear vertical guidezRight-click on channel name)r-   rŸ  Úboolr}   r@  ÚplatformÚsystemr%  r;   Ú	noise_covr   )r5   rÔ   Zis_rawZis_epoÚis_icaZhas_projZis_macZdur_keysZch_keysZch_epoZica_badZdur_valsZch_valsZlclick_dataZlclick_nameZrclick_nameZldragrö  ZscrlÚ	help_textr/   rð  r6   râ  C  sˆ    ÿþ
ÿþþÿÞ$zMNEBrowseFigure._get_help_textc           %   	   C   sž  ddl m}m}m} ddlm} ddlm} t 	t
t| jjjjƒƒ¡}|  t|ƒ¡}tt| f}| j|tddd�}	|	 t¡}
|	jtdd	�}d
d|
  }d
d|  }|	j|
|||fddd�|	j_||	jjƒ}|jd|tƒ|tƒd|	jjd�|	j_|  ¡  |jd|d
ƒ|dt ƒd�}d dddddg¡}|jdd
|ddddd� |  ¡  |jd|dt ƒ|tƒd�}|jddd d!dd"d#� |jddd$d!dd%�|	_!|  ¡  |jd|dt ƒ|tƒd�}||d&ƒ|	_"|	j" #| j$¡ t%|	d'� dt }|jd||ƒ|tƒdd(�}||d)| jj&fd*�}| #| j'¡ ||	j_(|	 )¡ \}}|	 |t dt  ¡}||	 |¡ }| *d|¡ |  ¡  |j+d }d+\}}| ,||||¡ |j-d }t.|d,ƒD ]8\}}| /||| fd-d-|… ¡ | 0||| f¡ �qš|j1d } | jd| | d.fd!d/� ||| f D ]}!|! 2|j3¡ �qt|	jjj4j5ƒd
k �r2d0n|	jjj4j5d  6¡ }"t7d1t8d|"d2�ƒ}#|| jj9| j:d3fd4dd5œ|#—Ž}$|$| jj9_;| j< =d6| j>¡| jj?d6< d-S )7z$Create the annotation dialog window.r   )rÏ   ÚCheckButtonsÚSpanSelectorrÐ   rÒ   r¤  ZAnnotations©r*   ÚFigureClassrF   rÛ  FrÙ   r   r   Úequal©Úframe_onÚaspectrÞ   )rÚ   rà   rá   r   ZshareyrÝ   rØ  rß   rÔ  z3Left click & drag on plot: create/modify annotationz6Right click on annotation highlight: delete annotationz*Type in this window: modify new label namez.Enter (or click button): add new label to listz4Esc: exit annotation mode & close this dialog windowrÛ   g333333û?)r  r
  rß  rà  rÜ   rû   çš™™™™™Ù?r'   z
New label:r£   Úbold)r  r
  ÚweightÚBAD_)r  r
  zAdd new labelrË  )rà   rá   r   )zDraggable edges?©r‰   Úactives)çš™™™™™É?g333333ã?©r   rx   Nr×   )rÚ   r  z#ff0000r”   )rê   r„   Ú
horizontalr%   )ZminspanZuseblitrr   )@r  rÏ   rù  rú  r  rÑ   r  rÓ   r¢   Úarrayr¾  Úsetr-   rÔ   ro  r²  Ú_compute_annotation_figsizer}   ÚANNOTATION_FIG_WÚANNOTATION_FIG_MIN_HrÑ  rq   rk   ÚANNOTATION_FIG_PADrB  r‡   r#  Ú ANNOTATION_FIG_CHECKBOX_COLUMN_WÚshow_hide_axÚ_update_annotation_figÚjoinr€   r$  rz   r˜   Ú
on_clickedr|   r#   rn  r£  r¥  rg   r6  Ú
rectanglesÚ
set_boundsÚlinesr    Ú	set_xdataÚ	set_ydatar‰   r;  rš   rˆ   r�   rŽ   r    r;   rs   Ú_select_annotation_spanrt   rQ   r`   rz  ra   )%r5   rÏ   rù  rú  rÑ   rÓ   r‰   Úradio_button_hr*   rÌ  rÛ   rÜ   rN  rO  rP  Úinstructions_axÚinstructionsZtext_entry_axZ	button_axZdrag_ax_heightZdrag_axr¬  Zwidth_inZ	height_inZwidth_axr   r”   Ú_padÚ_sizer  rw  r©  r€   rÆ  ÚcolZrect_kwrt   r/   r/   r6   Ú_create_annotation_figŽ  sÖ    ý
 ÿ
  ý

ÿ
üÿþ
þÿÿ
þ
þÿÿþ


ÿÿ ÿþ
ÿz&MNEBrowseFigure._create_annotation_figc                 C   sD   | j j}dd„ |jD ƒ}| ¡ }tt||ƒƒ| j _| jddd� dS )z;Enable/disable display of annotations on a per-label basis.c                 S   s   g | ]}|  ¡ ‘qS r/   r�   ©r2   rª   r/   r/   r6   r7   ý  s     z?MNEBrowseFigure._toggle_visible_annotations.<locals>.<listcomp>FTr®  N)r-   Úshow_hide_annotation_checkboxesr‰   Ú
get_statusr;   r    r¿  r—  )r5   rK   Ú
checkboxesr‰   r  r/   r/   r6   Ú_toggle_visible_annotationsú  s
    z+MNEBrowseFigure._toggle_visible_annotationsc                 C   s   | j j | j _dS )z*Enable/disable draggable annotation edges.N)r-   rn  rS   r/   r/   r6   r£    s    z-MNEBrowseFigure._toggle_draggable_annotationsc                    s6  ddl m}m} | jj}|jj}|  ¡ }|  t|ƒ¡}|j	t
t| dd� | ¡  t|ƒr^dnd}|j|ddd	� |||ƒ|_t
t d
t  | }| d|f¡ d}	|jj}
t|
|jjƒD ]v\}}| |j¡ |j ¡  |j d¡¡}| |d |jd f¡ | | jj| ¡  ¡ | d¡ |  |	t|ƒ ¡ qºt|ƒ�rF| !d¡ |j "¡  |j #|j$¡ |j %d|j&¡ |jj'}| ¡  | (¡  t| }|j)d|fdd� dd„ |D ƒ‰ ˆ  *| jj+¡ ‡ fdd„|D ƒ}||jj'||d�}| #| j,¡ |jdddd	� |jD ]}| -d¡ �qt|ƒdk�r˜d}|j.d  /|¡ t|j0d dƒD ]P\}}| 1|d |d |d  f¡ | 2|d |d |d
  fdd|… ¡ �qF|j.D ]B}| |j¡ | 3¡ }||j4|j5 |j6f}| /|¡ | 7d¡ �qžt8 9|j0¡ :¡ D ].}| |j¡ | 1|d t8 9| ;¡ ¡ ¡ �qòˆ | j_+|| j_<dS )z7Draw or redraw the radio buttons and annotation labels.r   )rù  ÚRadioButtonsT)ÚforwardzExisting labels:zNo existing labelsNrÛ   )rà   rW  rû   g333333Ã?)r%   r   r   rú   rZ   ©r   r   )Zxlimrx  c                 S   s   i | ]
}|d “qS )Fr/   r‚   r/   r/   r6   rÓ  7  s      z:MNEBrowseFigure._update_annotation_fig.<locals>.<dictcomp>c                    s   g | ]}ˆ | ‘qS r/   r/   r‚   ©Úcheck_valuesr/   r6   r7   9  s     z:MNEBrowseFigure._update_annotation_fig.<locals>.<listcomp>)r§   r‰   r  zshow/
hide rÞ   F)çš™™™™™©?g      Ø?rØ   rØ   r  r   r,  )=r  rù  r'  r-   r¤  r‡   Z_get_annotation_labelsr  r}   Zset_size_inchesr  r  ÚclearÚ	set_titlerˆ   r  r  r6  r�   r    r‰   r;  rš   r›   rœ   r<  Z
set_centerr£   Úset_edgecolorÚannotation_segment_colorsr{   Úset_linewidthÚ
set_radiusrŒ   Zdisconnect_eventsr  r—   Zconnect_eventr«   r  r$  r  r_   r¿  r&  r!  r  r  r  r  r  Zget_bboxÚyminrN  rO  Zset_clip_onr¢   r
  ZravelÚ	get_xdatar#  )r5   rù  r'  rÌ  r§   r‰   r  Útitler   r¤   r�   r­   rz   r£   r  r  r%  Zboundsrw  Ústepr”   Zbboxr/   r*  r6   r    sŒ    þÿÿ

ÿÿ



þ
,

 z&MNEBrowseFigure._update_annotation_figc                 C   s0   | j jdkr| j js|  ¡  nt | j j¡ dS )z'Show/hide the annotation dialog window.N)r-   r¤  r%  r!  rO   rP   r4   r/   r/   r6   rž  W  s    
z&MNEBrowseFigure._toggle_annotation_figc                 C   s   t td| ƒS )al  Adapt size of Annotation UI to accommodate the number of buttons.

        self._create_annotation_fig() implements the following:

        Fixed part of height:
        0.1  top margin
        1.0  instructions
        0.5  padding below instructions
        ---  (variable-height axis for label list, returned by this method)
        0.1  padding above text entry
        0.3  text entry
        0.1  padding above button
        0.3  button
        0.1  padding above checkbox
        0.3  checkbox
        0.1  bottom margin
        ------------------------------------------
        2.9  total fixed height
        gffffffæ?)rs  r  )r5   Zn_labelsr/   r/   r6   r  ^  s    z+MNEBrowseFigure._compute_annotation_figsizec                 C   s~   | j jj ¡ }| j j |¡ |  ¡  |  ¡  dd„ | j jj jj	j
D ƒ |¡}| j j |¡ | j jjdd� | j jj d¡ dS )zAdd new annotation description.c                 S   s   g | ]}|  ¡ ‘qS r/   r�   r‚   r/   r/   r6   r7   {  s     z9MNEBrowseFigure._add_annotation_label.<locals>.<listcomp>Nr°  r  )r-   r¤  rz   r{   Znew_annotation_labelsrÏ  Ú_setup_annotation_colorsr  r‡   rˆ   r‰   rŠ   rŒ   r—   r~   )r5   rK   r€   r–   r/   r/   r6   r|   t  s    ÿÿz%MNEBrowseFigure._add_annotation_labelc                 C   sª   t | jj|dƒ| jj }|| }| jjjjj}dd„ |jD ƒ}|jdk	rœ| 	|j¡}t
||| || | jjjƒ | jj|j sŒ| jj |¡ | jddd� n
t d¡ dS )z Handle annotation span selector.Tc                 S   s   g | ]}|  ¡ ‘qS r/   r�   r‚   r/   r/   r6   r7   ˆ  s     z;MNEBrowseFigure._select_annotation_span.<locals>.<listcomp>NFr®  zpNo annotation-label exists! Add one by typing the name and clicking on "Add new label" in the annotation-dialog.)r
   r-   rÔ   r7  r¤  r‡   rˆ   r‰   r‹   rŠ   r   ro  r¿  r#  r¦   r—  r   Úwarning)r5   ZvminZvmaxr¼  r5  rˆ   r‰   Z
active_idxr/   r/   r6   r  ƒ  s    
ÿz'MNEBrowseFigure._select_annotation_spanc                 C   s:   | j jdk	r6| j j ¡  d| j _d| j jj_| j ¡  dS )z=Remove annotation line from the plot and reactivate selector.NT)r-   ru  rJ   rs   rt   ru   rQ   r   r4   r/   r/   r6   rv   –  s
    z-MNEBrowseFigure._remove_annotation_hover_linec                 C   s*  t  t  | jj|k¡¡}|jd dkr*dS | jj}|j}| jj}|d d |d d g}t	|| jj|d  d dƒ}t  |j
|| k¡d }	|d dkr¼t	||dƒ| }|j|	 | | }
n|j
|	 }t	||dƒ| | }
|
dk rò||
7 }|
d9 }
t|||
 |j|	 ||	ƒ |  ¡  |  ¡  | j ¡  dS )zModify annotation.r   r   NTg      ð¿)r¢   r
  r½  r-   Úannotation_segmentsÚshaperÔ   ro  r7  r
   r¼  r5  r   r²  rÁ  rv   rQ   r^  )r5   Zold_xZnew_xÚsegmentrè  ro  r7  r–   r¼  rÃ  r5  r/   r/   r6   rv  ž  s2    

 þz"MNEBrowseFigure._modify_annotationc                 C   s|   t | jjƒD ]}| ¡  | jj |¡ qt | jjƒD ]}| ¡  | jj |¡ q4t | jjƒD ]}| ¡  | jj |¡ q\dS )z&Clear all annotations from the figure.N)r[   r-   ro  rJ   Úhscroll_annotationsÚannotation_texts)r5   Úannotr€   r/   r/   r6   Ú_clear_annotations¹  s    z"MNEBrowseFigure._clear_annotationsc              
   C   s*  |   ¡  |  ¡  | jj}| jj}| jj}| ¡ }t|ƒD ]ì\}\}}| jjj	j
| }| jj| }	t|	d| jjd d�}
| jj| r8| jjjd||f|
Ž}| jj |¡ t ||g|d |d ¡}t |¡dkr8|j|f|ž|
Ž}| jj	 |¡ | ¡ |d f}|j||dd	d
d|	d�}| jj |¡ q8dS )z&Draw (or redraw) the annotation spans.rù   Úann)rƒ   rê   rå   r)  r   rx   r   )r   é	   r  r£   Úbaseline)r  r  r
  r  rƒ   N)r?  Z_update_annotation_segmentsr-   r9  r‘  rs   rr  rŸ   rÔ   ro  r²  r0  r;   rå   r¿  r  Zfill_betweenxr<  rÏ  r¢   r”  r'  Úmeanr=  r=  )r5   Úsegmentsr‘  r§   rx  r–   rT  r„  rÄ  Zsegment_colorr>   r>  Zvisible_segmentr  r€   r/   r/   r6   rÁ  Å  s:    
ÿÿ
  þz!MNEBrowseFigure._draw_annotationsc              	   C   s¨  ddl m} ddlm} ddlm} | jdtddd�}|d	d
d�}| |dd… ¡|j	_
t| j	jddd|j	j
| j	jdd� |jddddd� d|j_|  ¡  |j|dd… ddd�}||j	_| j	j}|jtjg td�d� t|ƒ}|| j	jƒd }	||||	d�|_d|j	_|jjD ]0}
|
 dt|ƒ ¡ |
 d¡ |
  | j	j¡ �q| !¡  d}|j|dd… dd �}|j"d!d"|d#d$d$d%d&� | #¡  |j $|j%¡ |jj& '|j(¡ dS )'z'Create channel selection dialog window.r   )Úto_rgb)ÚGridSpec)r'  )rû   é   r¯   zChannel selectionrû  é   r   )ZnrowsZncolsNrØ  ÚselectÚallr  F)ÚkindÚch_typer5  ÚaxesZ	ch_groupsÚshowrÜ  g®Gáz®ï?)rÜ   rÝ   rÛ   rÞ   r   éýÿÿÿrý  rþ  ©Zdtype)r³   )r'   )rÁ   rØ   a  To use a custom selection, first click-drag on the sensor plot to "lasso" the sensors you want to select, or hold Ctrl while clicking individual sensors. Holding Ctrl while click-dragging allows a lasso selection adding to (rather than replacing) the existing selection.©rÿ  g{®Gáz¤?g{®Gáz´?rÜ   rÛ   T)r  r
  rá  Úwrap))r  rE  Zmatplotlib.gridspecrF  r  r'  rÑ  r®   r  r-   Z	sensor_axr   r+  Úgroup_byr[  rº   Zlinewidth_selectedrÂ   r‡   r´   r_   r¢   r
  Úintr[   r+   rˆ   rµ   r�   r2  r}   r1  r/  rÃ   r€   r$  r  r—   r\   rÏ  rÀ   )r5   rE  rF  r'  rÌ  Úgsr‡   r¹   r‰   rÁ   r­   r  r  r/   r/   r6   Ú_create_selection_figæ  sV    ý þÿ
ÿ ÿz%MNEBrowseFigure._create_selection_figc              
   C   sŒ   | j jj jj}dd„ |jD ƒ}d}| j j}t|ƒD ]T\}}|t|| ƒ7 }|j|k r2t	|ƒ� | 
|¡ W 5 Q R X | j j |¡  dS q2dS )z:Handle clicks on vertical scrollbar when using selections.c                 S   s   g | ]}|  ¡ ‘qS r/   r�   r‚   r/   r/   r6   r7     s     z=MNEBrowseFigure._change_selection_vscroll.<locals>.<listcomp>r   N)r-   r¯   r‡   rˆ   r‰   r´   rŸ   r}   Úydatar   r¦   r—   )r5   rK   rˆ   r‰   Úoffsetr¹   r–   rz   r/   r/   r6   r·    s    

z)MNEBrowseFigure._change_selection_vscrollc           	      C   sÎ   | j j}| j j}|j jj}|j}dd„ |jD ƒ}| |¡| j jj _|| | j _	t
| j j	ƒ| j _|  ¡  |dkrrdnd}t t| ¡ ƒ¡}t || j j	d k¡d | }|| j _|  ¡  |  ¡  | jdd� dS )	z>Update visible channels based on selection dialog interaction.c                 S   s   g | ]}|  ¡ ‘qS r/   r�   )r2   Z_labelr/   r/   r6   r7   0  s     z5MNEBrowseFigure._update_selection.<locals>.<listcomp>ÚVertexr   rx   Tr}  N)r-   r´   r¯   r‡   rˆ   r‹   r‰   rŠ   rµ   rÇ  r}   r1  rÂ   r¢   Zconcatenater[   rä  r½  r“  rœ  r–  r—  )	r5   r¹   rÌ  rˆ   rz   r‰   rŠ   r*  r“  r/   r/   r6   r¸   *  s     
z!MNEBrowseFigure._update_selectionc                 C   s<   t  | jjjj| jj| jj ¡ ¡ d }| jjj |¡ dS )z0Update the sensor plot to show what is selected.r   N)	r¢   r¼   r-   r¯   rº   r½   rÇ  r¾   Zselect_many)r5   r¿   r/   r/   r6   rÂ   A  s    ÿÿz+MNEBrowseFigure._update_highlighted_sensorsc                 C   s†   t ƒ }t| jjƒ}tD ]}|| jjkr| || ¡ qt ||¡ 	¡ d }| jj
}t|ƒ|jj|df< |jj |jj¡ |j ¡  dS )z:Update the sensor plot to reflect (un)marked bad channels.r   N)r[   r   r-   r+  r   r/  Úextendr¢   r¼   r¾   r¯   rö   rº   ÚecZ
collectionZset_edgecolorsrQ   r^  )r5   rV  Zmark_badZsensor_picksZ
ch_indicesÚ	this_typeZ
sensor_idxrÌ  r/   r/   r6   Ú_update_bad_sensorsG  s    z#MNEBrowseFigure._update_bad_sensorsc                    sâ  ddl m}m} ˆ jj}dd„ |D ƒ}tˆ jjƒD ]\}}|r2||  d7  < q2tdtdd„ |D ƒƒd d	 gƒ}t|ƒd
 d d }ˆ j	||fddd�}	|	j
 d‡ fdd„¡ d| }
d|
d
d|
 f}|	j|ddd�}tˆ jjƒrèdnd}d}| |› |› �¡ |||ˆ jjd�}t|j|j|jƒD ]H\}}}| ¡  d¡�rb| d¡ | d¡ dd„ |D ƒ | d
¡ �q&|	jd d!d	|
fd"d#�}||d$ƒ|	j_| ˆ j¡ |	jj tˆ jd"d%�¡ ||	j_ˆ jjj
 ¡  t ˆ jjdd&� d'S )(z$Create the projectors dialog window.r   )rÏ   rù  c                 S   s   g | ]}|d  ‘qS )Údescr/   )r2   r©   r/   r/   r6   r7   _  s     z4MNEBrowseFigure._create_proj_fig.<locals>.<listcomp>z (already applied)g      @c                 S   s   g | ]}t |ƒ‘qS r/   rÕ  r‚   r/   r/   r6   r7   d  s     é   r'   r   é   rÞ  Úfig_projzSSP projection vectorsrÚ  rY   c                    s   | j dkrˆ  | ¡S d S )NZjJ)r@   rT   )Zevr4   r/   r6   rî   l  rï   z2MNEBrowseFigure._create_proj_fig.<locals>.<lambda>gUUUUUUÅ?r…  Frý  rþ  z3Projectors already applied to the data are dimmed.
r  z2Projectors marked with "X" are active on the plot.r  z(already applied)z0.5ú0.7c                 S   s   g | ]}|  d ¡‘qS )rb  )r•   ©r2   r�   r/   r/   r6   r7     s     rØ   rÜ  TrQ  z
Toggle allrŒ  )rÌ  ÚwarnN)!r  rÏ   rù  r-   r@  rŸ   Úprojs_activers  r}   rÑ  rQ   r`   rB  rº  r.  Úprojs_onr    r‰   r  r  r{   r˜  r•   r/  r1  Zproj_allr  r¢  r   Úproj_checkboxesra  r   r#   )r5   rÏ   rù  r@  r‰   rR  ru   rN  rO  rÌ  rX  rÚ   r§   Ú
first_lineZsecond_liner%  rz   r”   r  Zax_allr/   r4   r6   Ú_create_proj_figZ  sX    "
þ
þ
ÿÿþ

ÿz MNEBrowseFigure._create_proj_figc                 C   s(   | j jdkr|  ¡  nt | j j¡ dS )z'Show/hide the projectors dialog window.N)r-   ra  ri  rO   rP   rS   r/   r/   r6   r¡  Ž  s    
z MNEBrowseFigure._toggle_proj_figFc              	   C   sü   | j j}| j j}| j j}|r.t |t|ƒ ¡nt |j j 	¡ ¡}|dk	rÌ|rŠt
|j jƒ�, t ||k¡d D ]}|j j |¡ qlW 5 Q R X t
|j jƒ�0 t |¡d D ]}|| s¦|j j |¡ q¦W 5 Q R X d||< t ||¡sø|| j _|  ¡  |  ¡  dS )z+Perform operations when proj boxes clicked.Nr   T)r-   rf  re  ra  r¢   Z	full_likerJ  r
  rg  r$  r   r½  r¦   Zarray_equalZ_update_projectorr—  )r5   rK   r�  ÚonZappliedrÌ  Ú	new_staterR  r/   r/   r6   r¢  •  s(    ÿz%MNEBrowseFigure._toggle_proj_checkboxc                 C   s4   | j jdkr0| j jdkr"|  ¡  nt | j j¡ dS )z:Show or hide peak-to-peak histogram of channel amplitudes.r­  N)r-   rŸ  Zfig_histogramZ_create_epoch_histogramrO   rP   r4   r/   r/   r6   r   ®  s    
z'MNEBrowseFigure._toggle_epoch_histogramc                    sh   t ƒ  |¡\}}}| jjdk	r*|  ||¡ | jj|k ¡ d }|D ]}| jjj|  	|¡ qB|  
¡  dS )z?Mark/unmark bad channels; `idx` is index of *visible* channels.Nr   )r9   rµ  r-   r¯   r]  r*  r¾   r  Úpatchesr•   r—  )r5   r–   rƒ   rV  Z
marked_badZvscroll_idxZ_idxrB   r/   r6   rµ  ¶  s    z#MNEBrowseFigure._toggle_bad_channelc                    s6   t ƒ  |j¡\}}| jjj|  |¡ | jdd� dS )zMark/unmark bad epochs.Fr€  N)r9   r´  rm  r-   r  rl  r•   r—  )r5   rK   Úepoch_ixrƒ   rB   r/   r6   r´  Ä  s    z!MNEBrowseFigure._toggle_bad_epochc                 C   sP   |   ¡ | j_| jj ¡ j| jj ¡ j | j_| jj ¡ j| jj	 ¡ j | j_
dS )z?Compute difference between main axes edges and scrollbar edges.N)rh   r-   rY  r  Zget_positionZxmaxrs   r\  r3  r  r]  r4   r/   r/   r6   Ú_update_zen_mode_offsetsÎ  s    ÿÿz(MNEBrowseFigure._update_zen_mode_offsetsc                    sÌ   ˆ   ¡  ˆ jj }‡ fdd„dD ƒ}|d  |r4dndˆ jj 7  < |d  |rTdndˆ jj 7  < ˆ jf |Ž ˆ jj | ¡ dD ]:}|d	kršˆ jjršq„t	ˆ j|d
ƒd
k	r„t	ˆ j|ƒ |¡ q„|ˆ j_d
S )z*Show or hide scrollbars (A.K.A. zen mode).c                    s   i | ]}|t ˆ j|ƒ“qS r/   )rH   r  )r2   Úsider4   r/   r6   rÓ  Ý  s   ÿ z6MNEBrowseFigure._toggle_scrollbars.<locals>.<dictcomp>)rÛ   rÜ   rÞ   rÝ   rÜ   r   rx   rÞ   )r  r  r  r  r  N)
rn  r-   r"  r]  r\  r[  r   r!  r¶   rH   )r5   Zshould_showZmarginsÚelemr/   r4   r6   r§  Ö  s    

ÿ  z"MNEBrowseFigure._toggle_scrollbarsc                 C   s4   | j j d| j jf¡ | j j | j j¡ |  ¡  dS )z<Update the vertical scrollbar (channel) selection indicator.r   N)r-   r  Úset_xyr“  Ú
set_heightr1  Ú_update_yaxis_labelsr4   r/   r/   r6   r–  î  s    zMNEBrowseFigure._update_vscrollc                 C   s,   | j j | j jdf¡ | j j | j j¡ dS )z;Update the horizontal scrollbar (time) selection indicator.r   N)r-   r  rq  r4  Z	set_widthr5  r4   r/   r/   r6   rš  ô  s    zMNEBrowseFigure._update_hscrollc                 C   s˜   |j | jjd  }| jj| jjd  | jj | jj }t || jj|¡}| jjrtt 	| jj
dd… |¡}| jj
| }| jj|kr”|| j_|  ¡  dS dS )z&Handle clicks on horizontal scrollbar.r   rý   r   NTF)rm  r-   r5  r8  r+  r7  r¢   r”  r%  Úsearchsortedr&  r4  rš  )r5   rK   ÚtimeZmax_timerR  r/   r/   r6   r¹  ù  s    ÿÿz-MNEBrowseFigure._check_update_hscroll_clickedc                 C   s`   t  tt|j| jjd  ƒƒdt| jjƒ| jj ¡}| jj	|kr\|| j_	|  
¡  |  ¡  dS dS )z?Update vscroll patch on click, return True if location changed.r   r   TF)r¢   r”  rT  ÚroundrW  r-   r1  r}   r*  r“  r•  r–  )r5   rK   Znew_ch_startr/   r/   r6   r¸    s     þz-MNEBrowseFigure._check_update_vscroll_clickedc           	      C   s>  t | jj| jjƒD �]$\}}| jj| }| jj| }|| jjkr|dkr|| jjkr|t| jdi ƒkr|t| jdi ƒkr|| jj	d kr|| jj
kr| jjd | jj fd }| jjrºdnd}tt dd	g¡| | ƒ}|  |||¡ | jjr| jjd | jjd | jjd	 d  f}| jjd
 }||f}|  ||d¡ qdS )zAdd channel scale bars.ZstimÚunitsÚunit_scalingsrø   r   r   rú   rx   r   r'   ru  N)r    r-   Útrace_offsetsrÇ  r½   r/  Ú	scalebarsÚscalingsrH   r+  Úwhitened_ch_namesr‘  r7  r¶   Útupler¢   r
  Ú_draw_one_scalebarr%  r&  r1  )	r5   rX  rV  Ú	this_namer\  r�   rª  rž   Zy_valuer/   r/   r6   Ú_show_scalebars  s6    ÿ
þýüû
úÿzMNEBrowseFigure._show_scalebarsc                 C   sL   | j j ¡ D ]}| ¡  q| j j ¡ D ]}| ¡  q&tƒ | j _tƒ | j _dS )zRemove channel scale bars.N)r-   rz  rä  rJ   Úscalebar_textsr;   )r5   Úbarr€   r/   r/   r6   Ú_hide_scalebars/  s    


zMNEBrowseFigure._hide_scalebarsc                 C   s@   | j jr|  ¡  n|  ¡  |  ¡  | j j | j _| jdd� dS )zShow/hide the scalebars.Fr€  N)r-   Úscalebars_visiblerƒ  r•  r€  r—  rS   r/   r/   r6   r¦  8  s    
z!MNEBrowseFigure._toggle_scalebarsc                 C   s.  ddl m} d}t|| jjd d�}|dkrx| jjd d d›d	�}| jjj|d
 d |d d |fddddœ|—Ž}nz| jjr„dnd}	|	| jj	|  | jj
|  | jj }
||
ƒ› d| jj| › d�}| jjj|d |d |fddddœ|—Ž}| jjj||fddi|—Žd
 }|| jj|< || jj|< dS )zDraw a scalebar.r   )Ú_simplify_floatz#AA3377Zscalebarrä   ru  r   z.2fz secr   g¸…ëQ¸Ž?r,  rÜ   rÛ   zxx-small)r  r
  rà   rñ  rB  rÞ   Zlwrú   N)Úutilsr…  r;   r-   rå   r&  rs   r€   r¶   r{  rx  r›  rw  rD  rz  r�  )r5   r�   rž   rL  r…  rƒ   r>   rz   r€   r«  Zinv_normr‚  r/   r/   r6   r~  C  s<      þþ
ÿ
þý ÿÿ z"MNEBrowseFigure._draw_one_scalebarc           	      C   sÞ   | j jrR| j jdk	rRd}t| j jƒ}tj||dd�}dd„ |D ƒ}t |¡| }nJ| j jrŒtjt	| j j
dd�\}}}| ¡  t t	¡| }n| j j| j j }| j jj|dd�}|D ]&}| ¡ | j jkrÊd	nd
}| |¡ q²dS )zChange the y-axis labels.N)rY  r³   T)Úinvertc                 S   s    g | ]}|  d d¡  dd¡‘qS )zLeft-zL-zRight-zR-)Úreplacer"  r/   r/   r6   r7   `  s   ÿz8MNEBrowseFigure._update_yaxis_labels.<locals>.<listcomp>)Zreturn_indices)ZpickerÚitalicÚnormal)r-   r¶   r¯   r[   r´   r¢   r¼   r
  Úintersect1dr   r/  Úsortr½   rÇ  rs   Zset_yticklabelsr{   r|  Z	set_style)	r5   ÚexcludeZ
ticklabelsZ	keep_maskrS  ZixsÚtextsr€   Zstyr/   r/   r6   rs  Z  s,    ÿ ÿÿz$MNEBrowseFigure._update_yaxis_labelsrò   c                 C   sú   t  | jj ¡ ¡d }t  t  |¡ d ¡ t¡}|dkr>d}| jj	dkr€t|ƒ|krZd}|dkrrt
||ƒ› d�S tt
||ƒƒS | jjjd }tj| jjjd	�}tj|d	�}|| | }	|	 d
¡}
|rö|dkröt|	jƒrö|
t
|	jd |ƒ› dd… 7 }
|
S )zChange the x-axis labels.r   r   rÿ   rû   rö   Nz sÚ	meas_date)Úsecondsz%H:%M:%Srõ   g�íµ ÷Æ°>)r¢   r'  r-   rs   Z
get_xticksÚceilÚlog10ÚastyperT  r)  rv  rÐ  rÔ   r+  ÚdatetimeÚ	timedeltar7  ÚstrftimeÚmicrosecond)r5   r�   rí   rô   ZtickdiffÚdigitsr�  r7  ZxtimeZ	xdatetimeZxdtstrr/   r/   r6   r(  p  s$    
z MNEBrowseFigure._xtick_formatterc                 C   s‚   | j jdkrd| j _d}nd| j _d}| j j| j jfD ]}| |¡ q6| jddd� | j jd k	r~| j j ¡ r~|  | j j 	¡ ¡ d S )Nrö   Úclockr÷   rÅ   Fr®  )
r-   r)  rs   r  r  r—  rÿ   Zget_visibler¶  r4  )r5   Zx_axis_labelrU  r/   r/   r6   r¨  ˆ  s    z#MNEBrowseFigure._toggle_time_formatc                 C   st   | j j | j j¡ | j j | j _| j  j| j jr4dnd9  _|  ¡  |  ¡  | jdd� | j jdk	rp| j j 	¡  dS )zEnter or leave butterfly mode.r'   g       @Tr}  N)
r-   r  r!  r¶   r›  r•  rœ  r—  r¯   rÃ   r4   r/   r/   r6   r·   ž  s    z!MNEBrowseFigure._toggle_butterflyc                    s,  | j jrv| j jdk	rv|  ¡  |  ¡ }t|ƒ}t|ƒ}t g ¡}| j j	D ],}|D ]"}||| krNt 
|| |¡¡}qNqFnb| j jrÂt| j jƒ‰tˆƒ}‡fdd„tD ƒ‰ t ‡ fdd„| j jD ƒ¡}n| j j}tj|td�}|d df}| j j |¡ | j j t |¡¡ | j j | j j¡ || j _|  ¡  dS )z+Compute viewport height and adjust offsets.Nc                    s   g | ]}|ˆ kr|‘qS r/   r/   ©r2   Ú_type)Úunique_ch_typesr/   r6   r7   º  s    ÿz9MNEBrowseFigure._update_trace_offsets.<locals>.<listcomp>c                    s   g | ]}ˆ   |¡‘qS r/   )rŠ   )r2   rL  )Úch_type_orderr/   r6   r7   ¼  s   ÿrP  r'   ç      à¿)r-   r¶   r´   r•  Z_make_butterfly_selections_dictr}   r[   r¢   r
  rÇ  rÏ  rŠ   r  r/  r   r1  r9  rö   rs   r0  Z
set_yticksÚuniquer  rr  ry  rs  )r5   r¹   Z	n_offsetsZ	sel_orderÚoffsetsrV  Úselrx  r/   )r�  rœ  r6   rœ  ©  s2    
ÿ
z%MNEBrowseFigure._update_trace_offsetsc           6         sJ  ddl m} ddlm} ˆ jjr(ˆ  ¡  ˆ jj}ˆ jj| }ˆ jj	| }ˆ jj
r`ˆ jjdkr`|ntdƒ}ˆ jj| }t |ˆ jjd ¡}‡ fdd„|D ƒ}	|‡ fdd„t||	ƒD ƒƒ}
t |	¡ˆ j_ˆ jjj ¡ }ˆ jj
rô|D ]}| ˆ jj¡ qÞnt||
ƒD ]\}}| |¡ qþt |¡}t |ˆ jj¡}ˆ jj||< ‡ fd	d
„t|ƒD ƒ}t|ƒ}|tˆ jjƒk�rª|tˆ jjƒ }ˆ jjjt  d|ftj!¡fˆ jj"Ž}ˆ jj #|¡ ˆ jj|d… }|D ]}| $¡  �q¾ˆ jjd|… ˆ j_ˆ jj%ˆ jj& ddg }ˆ jj'dk�r^t (ˆ jj)|¡}t *|d |d ¡}ˆ jj+j,|d |d d … }t |ˆ jj-¡ .¡ \}tˆ jj/ƒ�r„ˆ jj/ 0d¡ $¡  �q`ˆ jj1dk�r¼t 2|
dd…ddd…f dˆ jj3df¡}n^t 4tˆ jjƒˆ jj3df¡}t5|ƒD ]8\}}ˆ jj1| ‰|‡fdd„|D ƒƒ|dd…|f< �qà|D ]>}tjˆ jj6ˆ jj7gt8d�| 9t:¡ }||ƒ|dd…|f< �qˆ jj ;¡ }t5ˆ jjƒD �]–\}} || }!|| }"|| }#|||  }$|#ˆ jj<| ˆ jj=  }%|%ddd|| …f }%ˆ jj>dk�rðt ?|%dd¡}%nŠˆ jj>dk	�rzˆ jj>ˆ jj
�rdnd }&t@|#|& |d ƒ}'tAd|& |d |' ƒ}(|t |d |'g¡|d |d  |(ˆ jjjBd�})|  C|)¡ |!ˆ jjd k}*ˆ jjD|*�ršdnd }+ˆ jj
�rÀ|*�sÀˆ jjD E|"|+¡}+ˆ jj'dk�rà|| ‰t5tjFˆdd�ƒD ]ô\},}ˆ|kjGdd�}-tjH|$tId�}.ˆ jj)| |- }/ˆ jj)|d  |- }0t|/|0ƒD ]&\}1}2t J|1|$k |$|2k¡}3|.|3B }.�q<tjKjL|$|. d�}4|,dk�rª|  M|4¡ |  N|%¡ |  |¡ |  O|+¡ n0ˆ jjj|4|%f||+dœˆ jj"—Ž}5ˆ jj/ #|5¡ �qèn,|  M|$¡ |  N|%¡ |  |
| ¡ |  O|+¡ �qvˆ jjjP|Ž  ˆ jj�r0ˆ  Q¡  ˆ jjRdk	�rFˆ  S¡  dS )z"Draw (or redraw) the channel data.r   rÆ   rÈ   Nrø   c                    s   g | ]}ˆ j j| ‘qS r/   )r-   r-  rš  r4   r/   r6   r7   Ý  s     z0MNEBrowseFigure._draw_traces.<locals>.<listcomp>c                    s    g | ]\}}|rˆ j jn|‘qS r/   )r-   r,  )r2   Z_badÚ_colorr4   r/   r6   r7   ß  s   ÿc                    s(   i | ] }|ˆ j jd d |… ˆ j j “qS rì   )r-   r‘  r7  )r2   Zdecim_valuer4   r/   r6   rÓ  î  s   þz0MNEBrowseFigure._draw_traces.<locals>.<dictcomp>r   rx   r­  rú   c                    s   g | ]}ˆ | ‘qS r/   r/   )r2   Z_ch)Úthis_colorsr/   r6   r7     s   ÿrP  .Úclamprž  r'   r  r   )r  rN  rO  rœ   Údata©rç   )ri  rä   )Tr  rÇ   r  rÉ   r-   r„  rƒ  rÇ  r½   r/  r¶   r´   Úslicery  r¢   r¼   r+  r    r
  Ú	ch_colorsrs   ZyaxisZget_ticklabelsr•   r+   Z	ones_likeZ
picks_dataÚdecimr  r}   rG  rD  rE  rF  rC  rZ  rJ   r‘  r7  rŸ  rt  r&  r9  rÔ   r»   Z
bad_epochsr¾   r³  r8   Zepoch_colorsÚtiler:  ÚemptyrŸ   Zepoch_color_badr,  Úobjectr“  rT  rr  r¥  r›  Zclippingr”  rs  r¥   rš   Zset_clip_pathrå   r]   rŸ  rJ  Z
zeros_likeró  Úlogical_andrá  Zmasked_arrayr  r  Z
set_zorderr6  r€  Úevent_timesÚ_draw_event_lines)6r5   rÇ   rÉ   rÇ  r½   r/  Z
offset_ixsr   Zbad_boolZgood_ch_colorsr¨  r‰   rz   rƒ   r©  Zdata_picks_maskZdecim_timesZn_picksZ	n_new_chsZ
new_tracesZextra_tracesÚtraceZ
time_rangerm  rQ  Zvisible_bad_epoch_ixZcustom_colorsÚiiZ	_epoch_ixZ_ixZ_colsrx  rw  r  r\  Zthis_offsetZ
this_timesZ	this_datar”  rÜ   rO  r”   Z	is_bad_chZthis_zZcixZbool_ixsri  Z_startsZ_stopsÚ_startÚ_stopZ_maskZ_timesZ_tracer/   )r5   r£  r6   Ú_draw_tracesË  s   ÿ
ÿþ
ÿÿ

þÿ ÿ
ÿ ÿÿ
ÿþþý

ÿ



 ÿ ÿþ


zMNEBrowseFigure._draw_tracesTc                    s6   t ƒ  ||¡ | jjr(| jjr(|  d¡}| j ¡  dS )z;Redraw (convenience method for frequently grouped actions).N)r9   r—  r-   Úvline_visibler%  Ú_recompute_epochs_vlinesrQ   r^  )r5   r�  ro  rS  rB   r/   r6   r—  ]  s    
zMNEBrowseFigure._redrawc                    sz  ddl m} ddlm} ˆ jjdk	�rvt ˆ jjˆ jj	d kˆ jjˆ jj	d k¡}ˆ jj| }ˆ jj| }t
|ƒ}|‡ fdd„|D ƒƒ}ˆ jj ¡ }t |d¡}	t ||¡}
t |	|
g¡j |dd¡}||d	|ˆ jjd
 d�}ˆ jj |¡ |ˆ j_t
ˆ jjƒ�rˆ jj ¡  ¡  qôt|||ƒD ]T\}}}ˆ jj ||¡}ˆ jjj|||d fddˆ jjdddd�}ˆ jj |¡ �q dS )z&Draw the event lines and their labels.r   )ÚLineCollectionrÆ   Nrx   c                    s   g | ]}ˆ j j| ‘qS r/   )r-   Zevent_color_dictrí  r4   r/   r6   r7   s  s   ÿz5MNEBrowseFigure._draw_event_lines.<locals>.<listcomp>r   r'   Úevents)Z
linewidthsr  rå   r   r£   rB  )r   r   r  r_  )r
  r  rƒ   r  r  r	  )Zmatplotlib.collectionsr·  r  rÇ   r-   Z
event_numsr¢   r­  r®  r‘  r}   rs   rr  Úrepeatrª  r3  ÚTZreshaperå   Zadd_collectionÚevent_linesZevent_textsr8   rJ   r    Zevent_id_revr]   r=  r+   rÏ  )r5   r·  rÇ   ri  Zthis_event_timesZthis_event_numsZn_visible_eventsr  rx  ÚxsZysÚsegsr»  Z_tZ_nZ_crz   Z	this_textr/   r4   r6   r¯  i  sH    ÿÿ
ÿ 
    ýz!MNEBrowseFigure._draw_event_linesc                 C   sÄ   |dkrt  | jj ¡ ¡d }t  | jjdd… ¡d }|| }| jjd }t  | jj	¡| | | }t  | jj ¡ ¡}t  
dgdggt|ƒddf¡}t  
|dd…df d¡|d< | jj |¡ |S )	zARecompute vline x-coords for epochs plots (after scrolling, etc).N)r   r   r   r   r   rþ   rd   r   ).r   )r¢   r
  r-   rÿ   Zget_segmentsr'  r&  r‘  r9  r:  rª  r}   Zset_segments)r5   rm  Z	epoch_durÚrel_timeZabs_timer¼  r½  r/   r/   r6   r¶  ‰  s    z(MNEBrowseFigure._recompute_epochs_vlinesc                 C   st   | j jr&|  |¡}|| j jjd  }n| j j |¡ | j j |¡ | j|dd�dd… }| j j	 
|¡ |  d¡ dS )zShow the vertical line(s).r   rÿ   ró   Nr×  T)r-   r%  r¶  rÔ   r‘  rÿ   r  r  r(  r  r~   rÂ  )r5   rm  r¾  r€   r/   r/   r6   r¶  œ  s    
zMNEBrowseFigure._show_vlinec                 C   sN   | j j| j j| j jfD ] }|dk	r| |¡ |  |¡ q|| j _| j ¡  dS )z"Show or hide the vertical line(s).N)	r-   rÿ   r  r  r!  Zdraw_artistrµ  rQ   r^  )r5   r   rÆ  r/   r/   r6   rÂ  ©  s    ÿ
zMNEBrowseFigure._toggle_vlinec                 C   s    ddl m} |p| }||ƒ dS )z,Force calling of the MPL figure close event.r   )Ú_close_eventN)Úfixesr¿  )r5   rÌ  r¿  r/   r/   r6   r¿  µ  s    zMNEBrowseFigure._close_eventc                 C   s   |p| }|j  |¡ d S rì   )rQ   rY   )r5   r@   rÌ  r/   r/   r6   Ú_fake_keypress»  s    zMNEBrowseFigure._fake_keypressr§   r   Úpressc           	   	   C   sˆ   |p| }|p| j j}|dkrp|dk	rpt|||||dd� |D ]}t|||||dd� q<t|||d ||dd� nt||||||d� dS )z-Fake a click at a relative point within axes.ZdragNrÂ  )rÌ  r§   ÚpointÚxformr˜   rK  Zmotionrx   Úrelease)r-   rs   r   )	r5   rÃ  Z
add_pointsrÌ  r§   rÄ  r˜   rK  Zapointr/   r/   r6   r   ¿  s(    
 ÿ
 ÿ ÿ
 ÿzMNEBrowseFigure._fake_clickc                 C   s   |p| }|j  |||¡ d S rì   )rQ   Zscroll_event)r5   r�   rž   r6  rÌ  r/   r/   r6   Ú_fake_scrollÐ  s    zMNEBrowseFigure._fake_scrollc                 C   s   t | ||ƒ d S rì   )r   )r5   Zch_indexr˜   r/   r/   r6   r   Ô  s    zMNEBrowseFigure._click_ch_namec                    s`   | j jj  ¡ }tˆ tƒr<t|d ˆ d  |d ˆ d  ƒ}n‡ fdd„|D ƒ}| j jj|Ž  d S )Nr   r   c                    s   g | ]}t |ˆ  ƒ‘qS r/   )rT  rc  ©Úfactorr/   r6   r7   Ý  s     z5MNEBrowseFigure._resize_by_factor.<locals>.<listcomp>)rQ   rR   Zget_width_heightr.  r}  rT  Úresize)r5   rÈ  rà   r/   rÇ  r6   Ú_resize_by_factor×  s    
ÿz!MNEBrowseFigure._resize_by_factorc                 C   sD   |dkr| j jj| j jd�}n|dkr2| j j ¡ }dd„ |D ƒ}|S )Nr�   )Úminorrž   c                 S   s   g | ]}|  ¡ ‘qS r/   r�   )r2   Zlbr/   r/   r6   r7   å  s     z3MNEBrowseFigure._get_ticklabels.<locals>.<listcomp>)r-   rs   Zget_xticklabelsr%  Zget_yticklabels)r5   Zorientationr‰   Zlabel_textsr/   r/   r6   Ú_get_ticklabelsà  s    zMNEBrowseFigure._get_ticklabelsc                 C   s(   t dd„ | jjjD ƒƒ}|dd … }|S )Nc                 s   s   | ]}|  ¡  ¡ V  qd S rì   )r{   Ústripr"  r/   r/   r6   r±  ê  s     z7MNEBrowseFigure._get_scale_bar_texts.<locals>.<genexpr>r   )r}  r-   rs   rŽ  )r5   rŽ  r/   r/   r6   Ú_get_scale_bar_textsé  s    z$MNEBrowseFigure._get_scale_bar_texts)NrÅ   )N)F)Nrò   )TF)N)N)NNNr§   r   rÂ  )N)N)Erl   rm   rn   ro   r:   rX  rX   rz  rT   rU   rW   rÉ  rÑ  rç  r�  râ  r!  r&  r£  r  rž  r  r|   r  rv   rv  r?  rÁ  rV  r·  r¸   rÂ   r]  ri  r¡  r¢  r   rµ  r´  rn  r§  r–  rš  r¹  r¸  r€  rƒ  r¦  r~  rs  r(  r¨  r·   rœ  r´  r—  r¯  r¶  r¶  rÂ  r¿  rÁ  r   rÆ  r   rÊ  rÌ  rÎ  rp   r/   r/   rB   r6   rÄ   C  s”     ÿ
 </ :KlQ!64


	
"  

      ÿ


		rÄ   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚMNELineFigurez0Interactive figure for non-scrolling line plots.c              	      sÂ   t ƒ jf ||dœ|—Ž d}d}d}d}|  |¡}	d|  |¡ }
| j|dd�}d| j|dd� }|  |dd¡g}td|ƒD ]$}| | j|d|d |d	 d
�¡ qz| jj|	|||
dd� || j_	d S )N)r*   rÔ   r…  r  gÍÌÌÌÌÌä?gffffffÖ?r   FrÙ   r   )Zsharexr  )rÛ   rÜ   rÝ   rÞ   Úhspace)
r9   r:   rk   r  ÚrangerÏ  r  r_   r-   Úax_list)r5   rÔ   Ún_axesr*   r>   rI  rJ  rK  rL  rÛ   rÞ   rÜ   rÝ   rM  rR  rB   r/   r6   r:   ô  s     
"ÿzMNELineFigure.__init__c                 C   sD   | j j\}}|  ¡ \}}t| ||||ƒ}| jf |Ž ||f| j _dS )zHandle resize event.N)r-   rY  rh   rZ  r[  r_  r/   r/   r6   rX   
  s        ÿzMNELineFigure._resize)rl   rm   rn   ro   r:   rX   rp   r/   r/   rB   r6   rÏ  ñ  s   rÏ  c                   C   s   t  d¡ dS )z+Close all figures (only used in our tests).rJ  N)rO   rP   r/   r/   r/   r6   Ú
_close_all  s    rÔ  c                   C   s   t t ¡ ƒS rì   )r}   rO   Zget_fignumsr/   r/   r/   r6   Ú_get_n_figs  s    rÕ  Tc              	   K   s|   ddl m} | dd¡}| r"tƒ ntdd�}||d�� tjf d|i|—Ž}W 5 Q R X t|j_|dk	rpt	||ƒ | 
¡  |S )	zInstantiate a new figure.r   )Ú
rc_contextrÛ  Nrâ   )rÍ  )Úrcrü  )r$   rÖ  r8   r;   rO   r?  ÚBACKENDr-   Úbackendr!   rc   )rÍ  rü  r>   rÖ  r5  r×  rÌ  r/   r/   r6   rÎ    s    
rÎ  c           
      K   sÈ   ddl m} |dkrtnt}t |  ¡ ¡}|dk	r:|| }tt ||¡ƒ}|dk	rzt	||ƒrb|g}t
||ƒ |d  ¡ }nF| ddd| d f¡}	tf | dt|	|d	œ|—Ž}| ¡ |j_|jj}||fS )
zInstantiate a new line figure.r   )ÚAxesNr*   r  g      @r   T)rÔ   rÍ  rü  r*   rÓ  )Zmatplotlib.axesrÚ  r   r   r¢   r
  Zget_channel_typesr}   r‹  r.  r"   Z
get_figurer8   rÎ  rÏ  rh   r-   rY  rÒ  )
rÔ   rM  rÇ  r>   rÚ  Úallowed_ch_typesr/  rÓ  rÌ  r*   r/   r/   r6   Ú_line_figure-  s.    ÿ


 ÿÿrÜ  c           *      K   s$  ddl m} ddlm} d}d}tƒ }|| D ]}||kr.| |¡||< q.t| |ƒrbtt|d�}n$t| |ƒrrt	}nt
dt| ƒ› d�ƒ‚t |¡rÂ|| jd	 d krÂtd
|› dd| jd	  › d�ƒ‚td|dddgƒ td|dƒ t|| jƒ}t| j||d�}tddƒ}tddƒ}tddƒ}tƒ } tƒ }!tƒ }"tƒ }#tƒ }$t| ||f|Ž\}%}t| ||||ƒ\} }!}#}"~t|ƒt|%jƒk}&dgt|ƒd  dg }'| D ]N}|| f|||||||	dœ|—Ž\}(})t| |ƒ�rÖtj|(dd�}(|$ |(¡ �q”t| |%|)|$| |"|!|#||&|
||||||||||'ƒ |%jdd� |%S ) z0Instantiate a new power spectral density figure.r   )Ú
BaseEpochs©ÚBaseRaw)Zn_fftZ	n_overlapZreject_by_annotation)Ú	bandwidthZadaptiveZlow_biasZnormalization)Úwindowz+Expected an instance of Raw or Epochs, got Ú.rý   zRequested fmax (u<    Hz) must not exceed Â½ the sampling frequency of the data (r'   z).Ú	area_modeNZstdrÑ  Úxscale)ÚlogZlinear)r�  Útitlesrw  r{  Fr   T)ÚtminÚtmaxrÇ  ÚfminÚfmaxrA  Ún_jobsr   r¦  rù   )rÐ  )r  rÝ  Úiorß  r;   r8   r.  r   r   r   Ú	TypeErrorÚtyper¢   Úisfiniter+  Ú
ValueErrorr   r   r   r   r[   rÜ  Ú_split_picks_by_typer}   rM  rC  rÏ  r   r[  )*rÔ   rA  rÇ  rM  rã  rç  rè  ré  rê  rë  rƒ   Z
area_alphaZdBÚestimater2  Zspatial_colorsrä  Z
line_alphaZsphererá  r�  r>   rÝ  rß  Zwelch_kwargsZmultitaper_kwargsZ
psd_kwargsÚkwZpsd_funcræ  rw  r{  Ú
picks_listÚ
units_listÚtitles_listÚscalings_listZpsd_listrÌ  Z
make_labelZxlabels_listZpsdZfreqsr/   r/   r6   Ú_psd_figureH  s‚    

ÿ


ÿ
   ÿþ
           ýrø  c                 C   sæ   t ƒ }t ƒ }t ƒ }t ƒ }|dkr$tnt}	|	D ]˜}
tddg d�}|
dkrP|
|d< n|
tkrb|
|d< nd||
< t| jf|Ž}t ||¡}t	|ƒdkr,| 
|¡ | 
||
 ¡ | 
||
 ¡ | 
||
 ¡ q,t	|ƒdkrÚtd	ƒ‚||||fS )
z>Separate picks, units, etc, for plotting on separate subplots.NF)ÚmegZref_megr�  )ÚmagZgradrù  ZfnirsTr   zNo data channels found)r[   r   r   r;   r   r	   r+  r¢   r‹  r}   rÏ  ÚRuntimeError)rÔ   rÇ  rw  r{  ræ  rô  rõ  r÷  rö  rÛ  rL  Zpick_kwargsZthese_picksr/   r/   r6   rñ  ‹  s0    ÿ


rñ  c           	      C   s†   t ƒ }dD ]R}|dkr|| n|| }t| j|ƒ}|dkrPd|d|   ||< q
|| ||< q
|d |d k r‚|d |d k r‚|S d	S )
zBCompute new figure-relative values to maintain fixed-size margins.)rÛ   rÞ   rÜ   rÝ   )rÛ   rÞ   )rÞ   rÝ   r   rÜ   rÝ   rÛ   rÞ   N)r;   rH   r  )	rÌ  r`  ra  rb  rc  rd  ro  ÚratioZrel_dimr/   r/   r6   rZ  ¨  s    ÿÿrZ  c                 c   s8   | j }| j d kr tdd„ d�| _ z
d V  W 5 || _ X d S )Nc                 S   s   d S rì   r/   )rK   rb   r/   r/   r6   rî   ½  rï   z!_patched_canvas.<locals>.<lambda>)r`   )rQ   r   )rÌ  Z
old_canvasr/   r/   r6   r>  ¹  s    

r>  c                  K   sÆ   ddl m} tf dtdœ| —Ž}|j ¡  | ¡  | d¡ |jj	sTd|j_	| 
¡  |jjdk}|sx|jjdkrx| ¡  t|jd	dƒrŽ| ¡  | ¡  |jddd
� t|jj|ƒrÂ| ¡  | ¡  |S )z*Instantiate a new MNE browse-style figure.r   rÞ  F)rÍ  rü  NTrÕ   )r»   rÚ   Zshow_optionsr®  )Zmne.iorß  rÎ  rÄ   rQ   r   rn  rX   r-   r"  r§  rŸ  rS  rV  rH   r¡  rœ  r—  r.  rÔ   r7  rÁ  )r>   rß  rÌ  r÷  r/   r/   r6   Ú_init_browserÄ  s(    

rý  )NN)Jro   r”  rô  r�   r»  r   Ú
contextlibr   Ú	functoolsr   Zmatplotlib.pyplotZpyplotrO   Únumpyr¢   r$   r   Zmatplotlib.figurer   r  r   r	   ro  r
   r?   r   Zio.pickr   r   r   r   r   Ztime_frequencyr   r   r†  r   r   r   r   r   r   rÎ  r   r   r   r   r   r   r    r!   r"   r#   ÚnameZionrØ  Zioffr  r  r  r  r(   rq   r®   rÄ   rÏ  rÔ  rÕ  rÜ  rø  rñ  rZ  r>  rý  r/   r/   r/   r6   Ú<module>   sn   %,]T@             ;#
C

