U
    f»{j#¢  ã                   @   sÈ  d Z ddlZddlZddlmZ ddlZddlmZmZ ddl	m
Z
 ddlZddlmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZ ddlmZmZ ddlmZ ddl m!Z! eG dd„ deƒƒZ"dd„ Z#dd„ Z$dFdd„Z%dd„ Z&e'ddd�Z(e'dddd �Z)e'dd!d!d"�Z*e'd#d$d%d"�Z+d&d'd'd(d)d*d*d*d'd'd*d*d*d+œZ,d,d-„ Z-d.d/„ Z.ed0d1„ ƒZ/edGd4d5„ƒZ0ddd6d7d8œZ1d9d:d;œZ2d<Z3d=Z4G d>d?„ d?eƒZ5d@dA„ Z6dHdBdC„Z7dDdE„ Z8dS )Iz,Conversion tool from BrainVision EEG to FIF.é    N)ÚdatetimeÚtimezone)ÚStringIOé   )ÚverboseÚloggerÚwarnÚfill_docÚ_DefaultEventParseré   )ÚFIFF)Ú_empty_info)ÚBaseRaw)Ú_read_segments_fileÚ_mult_cal_one)ÚAnnotationsÚread_annotations)Úmake_dig_montage)ÚHEAD_SIZE_DEFAULTc                       s.   e Zd ZdZed‡ fdd„	ƒZd	d
„ Z‡  ZS )ÚRawBrainVisiona  Raw object from Brain Vision EEG file.

    Parameters
    ----------
    vhdr_fname : str
        Path to the EEG header file.
    eog : list or tuple
        Names of channels or list of indices that should be designated
        EOG channels. Values should correspond to the header file.
        Default is ``('HEOGL', 'HEOGR', 'VEOGb')``.
    misc : list or tuple of str | 'auto'
        Names of channels or list of indices that should be designated
        MISC channels. Values should correspond to the electrodes
        in the header file. If 'auto', units in header file are used for
        inferring misc channels. Default is ``'auto'``.
    scale : float
        The scaling factor for EEG data. Unless specified otherwise by
        header file, units are in microvolts. Default scale factor is 1.
    %(preload)s
    %(verbose)s

    Attributes
    ----------
    impedances : dict
        A dictionary of all electrodes and their impedances.

    See Also
    --------
    mne.io.Raw : Documentation of attribute and methods.
    ©ZHEOGLZHEOGRZVEOGbÚautoç      ð?FNc               
      sÆ  t  d| ¡ t |¡}t |¡d }|dkr2dnd}	t||||ƒ\}
}}}}}}}t|dƒ�´}t|tƒrÔ|dkrÄd}t	t
|d	 ƒƒD ]}|t| ¡ ƒ7 }q†t |gd
d„ |D ƒ ¡}t|ƒd }n|dkrÒtƒ ‚n:t
|
d ƒ}| dtj¡ | ¡ }t| }d }|||  }W 5 Q R X t|tƒ�r(dn|}t||||d�}tt| ƒj|
|d g|g||||g|d� |  |¡ t|ƒ\}}}}| ¡ }t|| jd ƒ| _t||
d ƒ}|  |¡ |	�rÂ|  t ¡ d S )Nz Extracting parameters from %s...éÿÿÿÿú.ahdrTFÚrbÚFr   Z	skiplinesc                 S   s   g | ]}t |ƒ‘qS © )Úlen)Ú.0Úliner   r   ú]/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/io/brainvision/brainvision.pyÚ
<listcomp>S   s     z+RawBrainVision.__init__.<locals>.<listcomp>é   ÚCÚnchanÚsingle)ÚoffsetsÚfmtÚorderÚ	n_samples)Z
last_sampsÚ	filenamesÚorig_formatÚpreloadr   Ú
raw_extrasÚ
orig_unitsÚ	meas_dateÚsfreq)!r   ÚinfoÚopÚabspathÚsplitextÚ_get_hdr_infoÚopenÚ
isinstanceÚdictÚrangeÚintr   ÚreadlineÚnpZcumsumÚNotImplementedErrorÚseekÚosÚSEEK_ENDÚtellÚ_fmt_byte_dictÚsuperr   Ú__init__Zset_montageÚ_aux_hdr_infoÚ
splitlinesÚ_parse_impedanceÚ
impedancesr   Zset_annotationsZdrop_channelsÚ_AHDR_CHANNEL_NAME) ÚselfÚ
vhdr_fnameÚeogÚmiscÚscaler-   r   Ú	hdr_fnameÚextÚahdr_formatr2   Ú
data_fnamer(   r)   r*   Ú	mrk_fnameÚmontager/   ÚfZn_skipÚiir'   Ú	n_data_chZdtype_bytesr,   r.   ÚsettingsÚcfgZcinfoÚ_Zsplit_settingsZannots©Ú	__class__r   r!   rE   A   sd    
ÿ
   ÿ
     ý
ÿ
zRawBrainVision.__init__c                 C   sz  | j | d }| j | d }	| j | d dkrHt| |||||||ƒ �n.t|	tƒrxt|	 }
t| ||||||||
|d�
 nþ| j | d }t| j| dƒ�Ê}| || ¡ t	 
||| f¡}t|| ƒD ]–}| ¡  d¡}| ¡ }t|	tƒ�rd	|	k�r|	d	 d
k�r| dd
¡}d|k�r"| ¡ }nd|k�r8| d¡}ntdƒ‚dd„ |D ƒ|d|…|f< qÄW 5 Q R X t|||||ƒ dS )zRead a chunk of raw data.Ú
orig_nchanr(   r)   r$   )ÚdtypeÚ
n_channelsr'   r   ÚASCIIZdecimalsymbolÚ.ú,ú zVUnknown BrainVision data format encountered. Please contact the MNE-Python developers.c                 S   s   g | ]}t |ƒ‘qS r   ©Úfloat)r   Úpartr   r   r!   r"   �   s     z5RawBrainVision._read_segment_file.<locals>.<listcomp>N)Ú_raw_extrasÚ_read_segments_cr8   ÚstrÚ_fmt_dtype_dictr   r7   Ú
_filenamesr?   r=   Úemptyr:   r<   ÚdecodeÚstripr9   ÚreplaceÚsplitÚRuntimeErrorr   )rK   ÚdataÚidxÚfiÚstartÚstopÚcalsÚmultrX   r(   r_   r'   ÚfidÚblockrW   r    Z	line_datar   r   r!   Ú_read_segment_filev   s@    
 ÿÿ
þ


ÿ&z!RawBrainVision._read_segment_file)r   r   r   FN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rE   r|   Ú__classcell__r   r   r\   r!   r       s           þ4r   c              	   C   sØ   | j | d }| j | d }	t|	 }
t|	 }| j | d }t ||| f¡}t| j| ddd��^}t|tƒr|t 	|j
|j¡n|}|D ]4}| || || |  ¡ t ||
|| ¡||< q„W 5 Q R X t|||||ƒ dS )z"Read chunk of vectorized raw data.r*   r(   r^   r   r   )Ú	bufferingN)rh   rk   rC   r=   Zzerosr7   rl   r8   ÚsliceZarangerv   rw   r?   Úfromfiler   )Úrawrs   rt   ru   rv   rw   rx   ry   r*   r(   r_   Ún_bytesr`   r{   rz   ZidsZch_idr   r   r!   ri   ¡   s    "ri   c              	   C   s  t | dƒ�}| ¡ }W 5 Q R X | dd¡ d¡d  ¡ }t|dƒ zNt d| dd¡tjtj	@ ¡}d}|rx| 
d	¡ ¡ }|d
kr„d}| |¡}W n tk
r®   | d¡}Y nX t d|tj¡}|sèt tƒ ¡t tƒ ¡t tƒ ¡dfS || ¡ d… }t d|¡}|�r|d| ¡ … }t d|tj	¡}tƒ tƒ tƒ   }	}
}d}|D ]ª}| d¡}|dd… \}}}}| dd¡}| dd¡}|dk�r¬t|ƒdk�r¬|dk�r¬|d }| ¡ �r¾t|ƒnd}|
 |¡ |	 t|ƒd	 ¡ | |d | ¡ �qHt |	¡t |
¡t |¡|fS )aô  Read annotations from a vmrk/amrk file.

    Parameters
    ----------
    fname : str
        vmrk/amrk file to be read.

    Returns
    -------
    onset : array, shape (n_annots,)
        The onsets in seconds.
    duration : array, shape (n_annots,)
        The onsets in seconds.
    description : array, shape (n_annots,)
        The description of each annotation.
    date_str : str
        The recording time as a string. Defaults to empty string if no
        recording time is found.
    r   ÚasciiÚignoreÚ
r   ÚmarkerúCodepage=(.+)úutf-8r#   ÚANSIÚcp1252úlatin-1z\[Marker Infos\]Ú Nz^\[.*\]$z^Mk\d+=(.*)rc   é   ú\1é   zNew Segmentr   ú/)r7   Úreadrn   rq   ro   Ú_check_bv_versionÚreÚsearchÚ
IGNORECASEÚ	MULTILINEÚgroupÚUnicodeDecodeErrorr=   ÚarrayÚlistÚendrv   Úfindallrp   r   Úisdigitr;   Úappend)Úfnamerz   ÚtxtÚheaderÚ
cp_settingÚcodepageÚmZmk_txtÚitemsÚonsetÚdurationÚdescriptionÚdate_strr2   Z	info_dataÚmtypeZmdescZ
this_onsetZthis_durationr   r   r!   Ú	_read_mrk±   sT    


þ$
"ÿÿ
r¯   r   c                 C   s¬   t | ƒ\}}}}t|ƒ}|dkrtt | ¡d d }t |¡sNt | ¡d d }t d| ¡ t|ƒ\}}}}	|	d }tj	|t
d�| }tj	|t
d�| }t||||d�}
|
S )	a  Create Annotations from BrainVision vmrk/amrk.

    This function reads a .vmrk or .amrk file and makes an
    :class:`mne.Annotations` object.

    Parameters
    ----------
    fname : str | object
        The path to the .vmrk/.amrk file.
    sfreq : float | 'auto'
        The sampling frequency in the file. It's necessary
        as Annotations are expressed in seconds and vmrk/amrk
        files are in samples. If set to 'auto' then
        the sfreq is taken from the .vhdr/.ahdr file that
        has the same name (without file extension). So
        data.vmrk/amrk looks for sfreq in data.vhdr or,
        if it does not exist, in data.ahdr.

    Returns
    -------
    annotations : instance of Annotations
        The annotations present in the file.
    r   r   ú.vhdrr   z$Finding 'sfreq' from header file: %sr1   ©r_   )rª   r«   r¬   Ú	orig_time)r¯   Ú_str_to_meas_dater3   r5   Úexistsr   r2   rF   r=   r�   rf   r   )r£   r1   rª   r«   r¬   r­   r²   rP   r[   r2   Úannotationsr   r   r!   Ú_read_annotations_brainvision  s     
þr¶   c                 C   sx   d}d}|dkst ‚| dkr,td|› d�ƒ tddƒD ],}|| ¡ |f }t || ¡d	k	r6|  S q6t||| f ƒ d	S )
zCheck the header version.z�    MNE-Python currently only supports %s versions 1.0 and 2.0, got unparsable     %r. Contact MNE-Python developers for support.zEBrain ?Vision( Core| V-Amp)? Data( Exchange)? %s File,? Version %s\.0)r¥   rŠ   r�   zMissing header in z file.r#   r   N)ÚAssertionErrorr   r:   Ú
capitalizer—   r˜   )r¥   ÚkindZ	_data_errZ_data_reÚversionZthis_rer   r   r!   r–   9  s    
r–   r   r$   )ZMULTIPLEXEDZ
VECTORIZEDÚshortr;   r&   )ZINT_16ZINT_32ZIEEE_FLOAT_32r‘   )r»   r;   r&   z<i2z<i4z<f4r   ç�íµ ÷Æ°>gü©ñÒMbP?g•Ö&è.>r#   )ÚVõ   ÂµVÚuVÚmVÚnVr$   u   Â°Czn/au   ÂµSZuSZARUÚSÚNc              
   C   sr   |   ¡ } | dkrd S zt | d¡}W n: tk
r^ } zdt|ƒkrLW Y ¢
d S ‚ W 5 d }~X Y nX |jtjd�}|S )N)r�   Ú0Z00000000000000000000z%Y%m%d%H%M%S%fzdoes not match format)Útzinfo)ro   r   ÚstrptimeÚ
ValueErrorrj   rp   r   Úutc)r­   r0   Úer   r   r!   r³   b  s    
r³   c              	   C   s:  t | dƒ�ž}| ¡ }d}| dd¡ ¡ }t|dƒ | ¡ }zJt d| dd¡tjtj	@ ¡}|rl| 
d¡ ¡ }|dkrxd	}| |¡}W n tk
r¢   | d
¡}Y nX W 5 Q R X | d¡dkrÌ| d¡\}}n
|d }}t ¡ }t|ƒ�}| |¡ W 5 Q R X d}	| |	¡�sd}	d| |	d¡ }
t|
ƒ}d|_|||	|fS )zAux function for _get_hdr_info.r   rŒ   r‡   rˆ   r¥   r‹   r#   r�   rŽ   r�   z	[Comment]r   r�   zCommon InfoszCommon infosg    €„.AZSamplingIntervalF)r7   r<   rn   ro   r–   r•   r—   r˜   r™   rš   r›   rœ   Úfindrq   ÚconfigparserÚConfigParserr   Ú	read_fileÚhas_sectionÚgetfloatr   Ú	_unlocked)rP   rV   r¥   r§   rY   r¦   ÚparamsrZ   rz   Úcinfostrr1   r2   r   r   r!   rF   v  s>    


þ

rF   c           I         sø
  t |ƒ}t | ¡d }|dk}|dkr2td| ƒ‚t| ƒ\}‰ }}d|_ˆ  |d¡}	|	tkrhtd|	 ƒ‚t|	 }	ˆ  |d¡}
|
d	kr®ˆ  d
d¡}|t	kr¤td| ƒ‚t	| }n(|	dkr¾tdƒ‚‡ fdd„ˆ  
d¡D ƒ}t | ¡}t |ˆ  |d¡¡}t |ˆ  |d¡¡}d}t|dƒ�}| ¡ }W 5 Q R X |D ]6}t || ¡ ¡}|�r.|d }t|ƒ|d<  �qn�q.d|d< ˆ  |d¡}|�rˆ|d7 }d}|	dk�rzˆ  |d¡}W nZ tjk
�r    tdƒ t|dƒ�*}| dd¡ | ¡ }|t|  | }W 5 Q R X Y nX dg| }t |¡}t |¡}| tj¡ tƒ }tƒ }tƒ }ˆ  d ¡D ]ü\}} t t d!|¡d ƒd }!|  !d"¡} t"| ƒd#k �rŠ| d$7 } n| d% dk�r d&| d%< | dd#… \}"}#}$}%|" #d'd"¡}"|"||< |"||!< |$dk�rê|%�sæd(}$nd)}$|% #d*d¡}%|%||"< t |$ƒ||!< t$ |%d¡| ||!< |%d+k�rH|%dk�r8t%j&nt%j'||"< �qH|�rtt(|t(< t(|d< d,|t(< d)|d< d|d< |d-k�rŠt)| *¡ ƒn|}d}&ˆ  +d.¡�rÂd%d/l,m-}' t)ƒ }(t)ƒ })t)ƒ }*ˆ  d.¡D ]²}+||+d  },|) .|,¡ d0d1„ |+d  !d"¡D ƒ\}-}.}/t /|.¡}0t /|/¡}1|-dk�r(|-t0d2 9 }-|'t 1|-|1|0gg¡ƒd }2|2dk 2¡ �rl|,t)|ƒ| k�rl|* .|,¡ |( .|2¡ �qÆt 1|(¡d3 }(t3tt4|)|(ƒƒd4d5�}&t"|*ƒdk�rÂ||*7 }td6 5|*¡ƒ t 6|¡ 7¡ �rÚt8d7ƒ‚| 9¡ }d}3d8|k�r@| :d8¡}3||3d d… }d9\}4}5t;|ƒD ]$\}3}6t <d:|6¡�r8 �q@nd}3�q|3}7d}8d;|k�r°| :d;¡}3t;||3d d… |3d ƒD ]8\}3}6t <d<|6¡�r¨d=\}4}5d>}8td?ƒ  �q°n|7}3�qv|3�	r¸g }9g }:d@};dA||3 k�rÖd}<nd}<t !dB||3 ¡}=dC|=|4 k}>dC|=|5 k}?t;|dƒD ]Æ\}@}+|�r8|@t"|ƒk�r8|+t(k�r8 �qÔ|3|7k�rP||3|@  }An||7|@  }A|A =|+¡dk�spt>‚|8�r”t !|;|+¡}B|<t"|Bƒ d }Cn|<}Ct !|;||3|@  ¡}|: .||4|C  ¡ |9 .||5|C  ¡ �qt"|:ƒdk�ræ�n@t"t?|:ƒƒdk�rR|:d dDk�rnH|:d dEk�r dF|dG< n0t |:d ƒ|dG< |>�r&d)dtj@ |dG   |dG< nÔd}D|>�rÄdHd1„ |:D ƒ}:t Atj1|:tjBdI�¡|dG< d)dtj@ |dG   |dG< |dG dFk�rt"t?|:ƒƒdk�rd>}DnLdJd1„ |:D ƒ}:t Ctj1|:tjBdI�¡|dG< |dG dFk�rt"t?|:ƒƒdk�rd>}D|D�r&tdK|dG  ƒ t"|9ƒdk�r8�n€t"t?|9ƒƒdk�rŽ|9d dLk�rZn0t |9d ƒ|dM< |?�	r¸d)dtj@ |dM   |dM< �n*d}E|?�	r dNd1„ |9D ƒ}9t Ctj1|9tjBdI�¡|dM< zd)dtj@ |dM   |dM< W n> tDk
�	r   t"t?|9ƒƒdk�	r|dO dP |dM< d>}En Y nX n^dQd1„ |9D ƒ}9t Atj1|9tjBdI�¡|dM< t E|dM ¡�	r~|dO dP |dM< t"t?|9ƒƒdk�	r~d>}E|E�	r¸|dM |dO dP k�	r dR}Fnd}FtdS|dM |Ff ƒ tF GdT¡ g |dU< t;|ƒD �] \}3},|,|k�	sþ|3|k�	sþ|3| |k�
rt%jH}Gt%jI}Ht%jJ}%nz|,|k�
s4|3|k�
s4|3| |k�
r\t%jK}Gt%jI}H|,|k�
rT||, }%nt%j'}%n0|,dVk�
rzt%jL}Gt%jI}Ht%j'}%nt%jM}Gt%jN}Ht%jJ}%|dU  .t|,|H|G|3d |3d ||3 ||3 t OdWtj¡|%t%jPt%jQdX�¡ �	qÒd>|_| R¡  ||||	|||&|fS )Ya4  Extract all the information from the header file.

    Parameters
    ----------
    hdr_fname : str
        Raw EEG header to be read.
    eog : list of str
        Names of channels that should be designated EOG channels. Names should
        correspond to the header file.
    misc : list or tuple of str | 'auto'
        Names of channels or list of indices that should be designated
        MISC channels. Values should correspond to the electrodes in the
        header file. If 'auto', units in header file are used for inferring
        misc channels. Default is ``'auto'``.
    scale : float
        The scaling factor for EEG data. Unless specified otherwise by
        header file, units are in microvolts. Default scale factor is 1.

    Returns
    -------
    %(info_not_none)s
    data_fname : str
        Path to the binary data file.
    fmt : str
        The format of the binary data file.
    order : str
        Orientation of the binary data.
    n_samples : int
        Number of data points in the binary data file.
    mrk_fname : str
        Path to the marker file.
    montage : DigMontage
        Coordinates of the channels, if present in the header file.
    orig_units : dict
        Dictionary mapping channel names to their units as specified in
        the header file. Example: {'FC1': 'nV'}
    r   r   )r°   r   zOThe header file must be given to read the data, not a file with extension '%s'.TZDataOrientationz$Data Orientation %s is not supportedZ
DataFormatÚBINARYzBinary InfosZBinaryFormatzDatatype %s is not supportedr$   zdBrainVision files with ASCII data in vectorized order (i.e. channels in rows) are not supported yet.c                    s   i | ]}|ˆ   d |¡“qS )úASCII Infos)Úget)r   Úkey©rZ   r   r!   Ú
<dictcomp>ï  s   ÿ z!_get_hdr_info.<locals>.<dictcomp>rÔ   ZDataFileZ
MarkerFilez-^Mk\d+=New Segment,.*,\d+,\d+,-?\d+,(\d{20})$Úrr   r0   NZNumberOfChannelsr#   Z
DataPointszQNo info on DataPoints found. Inferring number of samples from the data file size.r   r   r�   zChannel Infoszch(\d+)rc   r‘   )r¾   r   r¾   r’   r¼   r   õ   Ã‚)r½   rÀ   r¾   r¿   rÁ   r½   r   ZCoordinates)Ú_sph_to_cartc                 S   s   g | ]}t |ƒ‘qS r   re   )r   Úcr   r   r!   r"   X  s     z!_get_hdr_info.<locals>.<listcomp>éè  g     @�@Úhead)Zch_posÚcoord_framez„No coordinate information found for channels {}. Setting channel types to misc. To avoid this warning, set channel types explicitly.zMissing channel unitsZChannels)r‘   r“   z#\s+NamezS o f t w a r e  F i l t e r sz#\s+Low Cutoff)r#   r   Fz\Online software filter detected. Using software filter settings and ignoring hardware valuesz\s+zResolution / Unitz\s\s+z[s])ÚNaNÚOffÚDCç        Úhighpassc                 S   s"   g | ]}|d krt |ƒntj‘qS )©rà   rá   râ   ©rf   r=   ZInf©r   Zfiltr   r   r!   r"   Ö  s   ÿr±   c                 S   s    g | ]}|d krt |ƒnd‘qS )rå   rã   re   rç   r   r   r!   r"   å  s   ÿzgChannels contain different highpass filters. Lowest (weakest) filter setting (%0.2f Hz) will be stored.©rà   rá   rÄ   Úlowpassc                 S   s    g | ]}|d krt |ƒnd‘qS )rè   rã   re   rç   r   r   r!   r"     s   ÿr1   g       @c                 S   s"   g | ]}|d krt |ƒntj‘qS )rè   ræ   rç   r   r   r!   r"     s   ÿz, Nyquist limitziChannels contain different lowpass filters. Highest (weakest) filter setting (%0.2f Hz%s) will be stored.z!Setting channel info structure...ZchszSTI 014é   )Úch_nameÚ	coil_typer¹   ZlognoZscannoÚcalr:   ÚlocÚunitZunit_mulrß   )Srf   r3   r5   ÚIOErrorrF   rÐ   rÕ   Ú_orientation_dictr>   Ú	_fmt_dictÚoptionsÚdirnameÚjoinr7   Ú	readlinesr—   r    ro   r³   ÚgetintrË   ÚNoOptionErrorr   r?   rB   rC   r=   rm   ÚfillÚnanr9   r©   r;   rq   r   rp   Ú
_unit_dictr   ZFIFF_UNIT_CELZFIFF_UNIT_NONErJ   rž   ÚkeysrÎ   Z
transformsrÛ   r¢   Zdeg2radr   r�   Úallr   ÚzipÚformatÚisnanÚanyrr   rG   ÚindexÚ	enumerateÚmatchrÊ   r·   ÚsetÚpiÚmaxZfloat64ÚminÚZeroDivisionErrorÚisinfr   r2   ZFIFFV_EOG_CHZFIFFV_COIL_NONEZFIFF_UNIT_VZFIFFV_MISC_CHZFIFFV_STIM_CHZFIFFV_EEG_CHZFIFFV_COIL_EEGÚfullZFIFF_UNITM_NONEZFIFFV_COORD_HEADZ_update_redundant)IrP   rM   rN   rO   rQ   rR   rY   rÒ   r2   r)   Zdata_formatr(   ÚpathrS   rT   ÚregexpZ	tmp_mrk_fÚlinesr    r  r­   r%   r*   rz   r†   Zch_namesrx   ÚrangesZch_dictZmisc_chsr/   ZchanÚpropsÚnÚnamer[   Ú
resolutionrï   rU   rÛ   Zmontage_posZmontage_namesZto_miscÚchrë   ZradÚthetaÚphiZpolÚazÚposrt   Zhp_colZlp_colÚsettingZidx_ampZfilter_list_has_ch_nameré   rä   ÚdividerÚshiftr¥   Zhp_sZlp_sÚiZline_ampZch_name_partsZ
real_shiftZheterogeneous_hp_filterZheterogeneous_lp_filterZnyquistr¹   rì   r   r×   r!   r6   ­  s   'ÿÿ

ÿ


 






ÿ




 
þþ



"

ÿ ÿ þÿÿ
þ
""



      ûÿr6   r   Fc                 C   s   t | |||||d�S )a  Reader for Brain Vision EEG file.

    Parameters
    ----------
    vhdr_fname : str
        Path to the EEG header file.
    eog : list or tuple of str
        Names of channels or list of indices that should be designated
        EOG channels. Values should correspond to the header file
        Default is ``('HEOGL', 'HEOGR', 'VEOGb')``.
    misc : list or tuple of str | 'auto'
        Names of channels or list of indices that should be designated
        MISC channels. Values should correspond to the electrodes in the
        header file. If 'auto', units in header file are used for inferring
        misc channels. Default is ``'auto'``.
    scale : float
        The scaling factor for EEG data. Unless specified otherwise by
        header file, units are in microvolts. Default scale factor is 1.
    %(preload)s
    %(verbose)s

    Returns
    -------
    raw : instance of RawBrainVision
        A Raw object containing BrainVision data.

    See Also
    --------
    mne.io.Raw : Documentation of attribute and methods.
    ©rL   rM   rN   rO   r-   r   )r   r  r   r   r!   Úread_raw_brainvisionV  s    "  þr  rÝ   iÐ  )zEvent/z
Stimulus/Sz
Response/RzOptic/OiŸ† iž† )zNew Segment/zSyncStatus/Sync Oni'  ZAHDR_CHANNELc                       s    e Zd ZdZ‡ fdd„Z‡  ZS )Ú_BVEventParserzDParse standard brainvision events, accounting for non-standard ones.c                    sl   t }|dd…  ¡ }|dd… }| ¡ rB||krBt|ƒ||  }n&|tkrTt| }ntt| ƒj|td�}|S )z=Parse BrainVision event codes (like `Stimulus/S 11`) to ints.éýÿÿÿN)Úoffset)	Ú_BV_EVENT_IO_OFFSETSro   r¡   r;   Ú_OTHER_ACCEPTED_MARKERSrD   r  Ú__call__Ú_OTHER_OFFSET)rK   r¬   r'   Zmaybe_digitr¹   Úcoder\   r   r!   r$  ‰  s    

 ÿz_BVEventParser.__call__)r}   r~   r   r€   r$  r�   r   r   r\   r!   r  †  s   r  c                 C   s<   t dd„ | D ƒƒ}t t ¡ ƒ t t ¡ ƒ¡}t|| ƒdkS )Nc                 S   s   g | ]}|  d ¡‘qS )z0123456789 )Úrstrip)r   Úddr   r   r!   r"   š  s     z#_check_bv_annot.<locals>.<listcomp>r   )r  r"  rü   Úunionr#  r   )ZdescriptionsZmarkers_basenameZ
bv_markersr   r   r!   Ú_check_bv_annot™  s
    
ÿr*  c                 C   s’  t | ƒ}dd„ | D ƒ}tƒ }t|ƒdk�rŽ|  |d ¡}|d  ¡ }|d  d¡ d¡}d}|dk	ršdd„ |d	  d
¡D ƒ}	|j|	d |	d |	d dd�}| |d d… D ]â}
t 	d|
¡}|�r†| 
¡  d
¡}|
 ¡ }t d|d ¡}t|røt|d ƒntj|d�}|dk	�r| d|i¡ |dk�r@d|k�r@| |d ¡ n<|dk�rdd|k�rd| |d ¡ nd|k�r|| |d ¡ |||< qª �qŽqª|S )a{  Parse impedances from the header file.

    Parameters
    ----------
    settings : list
        The header settings lines from the VHDR/AHDR file.
    recording_date : datetime.datetime | None
        The date of the recording as extracted from the VMRK/AMRK file.

    Returns
    -------
    impedances : dict
        A dictionary of all electrodes and their impedances.
    c                 S   s$   g | ]}|  d ¡r| d¡r|‘qS )zImpedance [z :)Ú
startswithÚendswith©r   r  r   r   r!   r"   °  s    

þz$_parse_impedance.<locals>.<listcomp>r   r#   ú[ú]Nc                 S   s   g | ]}t |ƒ‘qS r   )r;   r-  r   r   r!   r"   ½  s     r   ú:r   )ÚhourÚminuteÚsecondÚmicrosecondz[ a-zA-Z0-9_+-]+:z[-+]?\d*\.\d+|\d+r   )ÚimpZimp_unitZimp_meas_timeZRefÚ	ReferenceZGndÚGroundÚData)Ú_parse_impedance_rangesr9   r   r  rq   Úlstripr'  rp   r—   r  r›   r    rf   r=   rú   Úupdate)rY   Zrecording_dater  Zimpedance_setting_linesrI   rt   Zimpedance_settingZimpedance_unitZimpedance_timeZ	meas_timer  r  Zchannel_nameZchannel_imp_lineZimp_as_numberZchannel_impedancer   r   r!   rH      sL    
ýÿþ


rH   c                 C   sž   dd„ | D ƒ}t ƒ }|ršt|ƒdkr`|d  ¡ }dD ](}t|d ƒt|d ƒ|d d	œ||< q4n:|D ]4}| ¡ }t|d
 ƒt|d ƒ|d d	œ||d < qd|S )a/  Parse the selected electrode impedance ranges from the header.

    Parameters
    ----------
    settings : list
        The header settings lines from the VHDR/AHDR file.

    Returns
    -------
    electrode_imp_ranges : dict
        A dictionary of impedance ranges for each type of electrode.
    c                 S   s   g | ]}d |kr|‘qS )z$Selected Impedance Measurement Ranger   )r   Úitemr   r   r!   r"   ë  s    ÿz+_parse_impedance_ranges.<locals>.<listcomp>r#   r   )r8  r6  r7  éüÿÿÿéþÿÿÿr   )Zimp_lower_boundZimp_upper_boundZimp_range_unité   é   é	   )r9   r   rq   rf   )rY   Zimpedance_rangesZelectrode_imp_rangesZ	img_rangeZelectrode_typeZelectrode_ranger   r   r!   r9  Þ  s"    

ý

ýr9  )r   )r   r   r   FN)N)9r€   rË   r@   Úos.pathr  r3   r—   r   r   Úior   Únumpyr=   Úutilsr   r   r   r	   r
   Ú	constantsr   Z	meas_infor   Úbaser   r   r   rµ   r   r   Zchannelsr   Údefaultsr   r   ri   r¯   r¶   r–   r9   rñ   rò   rC   rk   rû   r³   rF   r6   r  r"  r#  r%  rJ   r  r*  rH   r9  r   r   r   r!   Ú<module>   s„    \
,ô7
   +        þ&ÿ ÿ
>