U
    f»{jõ*  ã                   @   sì   d dl m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 ddlmZmZ ddlmZ dd	lmZmZmZmZ G d
d„ deƒZdd„ Zdd„ Zeddd„ƒZdd„ Zede	jde ddfdd„ƒZ!dgdgfdd„Z"dd„ Z#dS ) é    N)ÚBytesIOÚSEEK_SET)ÚGzipFileé   )Úread_tag_infoÚread_tagÚTagÚ_call_dict_names)Úmake_dir_treeÚdir_tree_find)ÚFIFFé   )ÚloggerÚverboseÚ
_file_likeÚwarnc                   @   sF   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zefd
d„Z	ddd„Z
dS )Ú_NoCloseReadzDCreate a wrapper that will not close when used as a context manager.c                 C   s
   || _ d S ©N©Úfid)Úselfr   © r   úJ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/io/open.pyÚ__init__   s    z_NoCloseRead.__init__c                 C   s   | j S r   r   ©r   r   r   r   Ú	__enter__   s    z_NoCloseRead.__enter__c                 C   s   d S r   r   )r   Útype_ÚvalueÚ	tracebackr   r   r   Ú__exit__   s    z_NoCloseRead.__exit__c                 C   s   d S r   r   r   r   r   r   Úclose   s    z_NoCloseRead.closec                 C   s   | j  ||¡S r   )r   Úseek)r   ÚoffsetÚwhencer   r   r   r!   "   s    z_NoCloseRead.seekéÿÿÿÿc                 C   s   | j  |¡S r   )r   Úread)r   Úsizer   r   r   r%   %   s    z_NoCloseRead.readN)r$   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r    r   r!   r%   r   r   r   r   r      s   r   c                 C   sh   t | ƒrt| ƒ}| d¡ nHt| ƒ} t | ¡d  ¡ dkrPt d¡ t	| dƒ}nt d¡ t
| dƒ}|S )z+Open a FIF file with no additional parsing.r   r   z.gzz
Using gzipÚrbzUsing normal I/O)r   r   r!   ÚstrÚopÚsplitextÚlowerr   Údebugr   Úopen)Úfnamer   r   r   r   Ú_fiff_get_fid)   s    


r3   c                 C   sp  t |tjƒ}d}|D �]T}d}|d D �]2}|jtjkrbt| |jƒ}t|jƒ}|tj	krbd} �q\|jtj
krŽt| |jƒ}t t |¡|j¡}|jtjkr&|dk	r¤q&t| |jƒj}	t |¡\}
}| d¡}| d¡}||d |… }| ¡ sðd}|dk �r0|	dk�r0t |
d|d|… |	||d d… f ¡}q&t |
d|d|… |	||d d… f ¡}q&|dk	r �qlq|S )	z%Get the next filename in split files.NÚ	directoryÚ.ú-r   r$   r   z%s-%d.%s)r   r   Z	FIFFB_REFÚkindZFIFF_REF_ROLEr   ÚposÚintÚdataZFIFFV_ROLE_NEXT_FILEZFIFF_REF_FILE_NAMEr-   ÚjoinÚdirnameZFIFF_REF_FILE_NUMÚsplitÚfindÚrfindÚisdigit)r   r2   ÚtreeZ
nodes_listZ
next_fnameZnodesÚentÚtagZroleZnext_numÚpathÚbaseÚidxZidx2Znum_strr   r   r   Ú_get_next_fname9   sL    




 ÿÿÿrG   Fc                 C   s:   t | ƒ}zt| ||ƒW S  tk
r4   | ¡  ‚ Y nX dS )aX  Open a FIF file.

    Parameters
    ----------
    fname : str | fid
        Name of the fif file, or an opened file (will seek back to 0).
    preload : bool
        If True, all data from the file is read into a memory buffer. This
        requires more memory, but can be faster for I/O operations that require
        frequent seeks.
    %(verbose)s

    Returns
    -------
    fid : file
        The file descriptor of the open file.
    tree : fif tree
        The tree is a complex structure filled with dictionaries,
        lists and tags.
    directory : list
        A list of tags.
    N)r3   Ú
_fiff_openÚ	Exceptionr    )r2   Úpreloadr   r   r   r   r   Ú	fiff_opend   s    rK   c              	   C   sz  |r |�}t | ¡ ƒ}W 5 Q R X t|ƒ}dt| ƒ› d�}|jtjkrRt|› d�ƒ‚|jtj	krlt|› d�ƒ‚|j
dkr„t|› d�ƒ‚t|ƒ}|jtjkr¦t|› d�ƒ‚t d|  ¡ t|jƒ}d}|dkröt||ƒ}|d krìtd	| › �ƒ n
|j}	d
}|�rN| dd¡ tƒ }	|jdk�rN| ¡ }
t|ƒ}|d k�r:�qNn|
|_|	 |¡ �qt||	ƒ\}}t d¡ | d¡ |||	fS )Nzfile z	 does notz start with a file id tagé   z have a directory pointerz$    Creating tag directory for %s...Tr   zKFIF tag directory missing at the end of the file, possibly corrupted file: Fz[done])r   r%   r   Úreprr7   r   ZFIFF_FILE_IDÚ
ValueErrorÚtypeZFIFFT_ID_STRUCTr&   r   ZFIFF_DIR_POINTERr   r0   r9   r:   r   r!   ÚlistÚnextÚtellr8   Úappendr
   )r2   r   rJ   Zfid_oldrC   ÚprefixZdirposZ	read_slowZdir_tagr4   r8   rA   Ú_r   r   r   rH   „   sJ    





rH   z    é   c              
   C   sz   |t tfkrtdƒ‚t|tƒr&t|ƒ}t| ƒ\}}}	tj|d< |�}
t|
||d|||d�}W 5 Q R X |tkrvd 	|¡}|S )a  Show FIFF information.

    This function is similar to mne_show_fiff.

    Parameters
    ----------
    fname : str
        Filename to evaluate.
    indent : str
        How to indent the lines.
    read_limit : int
        Max number of bytes of data to read from a tag. Can be np.inf
        to always read all data (helps test read completion).
    max_str : int
        Max number of characters of string representation to print for
        each tag's data.
    output : type
        Either str or list. str is a convenience output for printing.
    tag : int | None
        Provide information about this tag. If None (default), all information
        is shown.
    %(verbose)s

    Returns
    -------
    contents : str
        The contents of the file.
    zoutput must be list or strÚblockr   )ÚindentÚlevelÚ
read_limitÚmax_strÚtag_idÚ
)
rP   r,   rN   Ú
isinstancer9   rK   r   Z
FIFFB_ROOTÚ
_show_treer;   )r2   rX   rZ   r[   ÚoutputrC   r   ÚfrA   r4   r   Úoutr   r   r   Ú	show_fiffÁ   s    


  ÿ
rc   ÚFIFF_Z	FIFF_UNITc                    s8   t ˆƒ‰‡ ‡‡fdd„t ¡ D ƒ}t|ƒdkr4dg}|S )zFind matching values.c                    sH   g | ]@\‰ }|ˆkrt ‡ fd d„ˆD ƒƒrt ‡ fdd„ˆD ƒƒsˆ ‘qS )c                 3   s   | ]}|ˆ kV  qd S r   r   )Ú.0Úfmt©Úkr   r   Ú	<genexpr>ô   s     z(_find_type.<locals>.<listcomp>.<genexpr>c                 3   s   | ]}|ˆ kV  qd S r   r   )re   Úexcrg   r   r   ri   õ   s     )Úany)re   Úv©ÚexcludeÚfmtsr   rg   r   Ú
<listcomp>ó   s
     þz_find_type.<locals>.<listcomp>r   z???)r9   r   ÚitemsÚlen)r   ro   rn   Úvalsr   rm   r   Ú
_find_typeð   s
    rt   c              
   C   s†  ddl m} || }||d  }	|tt|d ƒƒ d d t|d dgd�¡ g}
d	}|d
kst|
d  ¡  t|ƒ¡rxd}|d d
k	�rFdd„ |d D ƒdg }dd„ |d D ƒ}dd„ |d D ƒ}dd„ |d D ƒ}d}d}t|d
d… |dd
… |||ƒD �]8\}}}}}|�s||k�rqüt	||d|ƒ}|d
k�s@||k�rjzt
| |ƒ}W n tk
�rh   d	}Y nX ||k�r~|d7 }qüt|dgd�}|dk�rªdt|d ƒ d nd}d}|jd
k	�r¾dt|jƒd
|…  }t|jtjƒ�r|jjdk�r¾|dt|jjƒ 7 }n¶t|jtƒ�r.|dtt|jƒƒ 7 }n�t|jtƒ�rT|dtt|jƒƒ 7 }njt|jttfƒ�r~|dtt|jƒƒ 7 }n@| |j¡�r¨|d|j ¡ |jjf 7 }n|dtt|jƒƒ 7 }|�sÈdn|}t |d|f ¡}|
|	| t|ƒ d d |¡ d t|ƒ d |  | g7 }
|
d  d!d"¡|
d< d}d}qü||k�rFd}|�sVdg}
d}|d# D ]"}|
t| |||d |||ƒ7 }
�q^|
S )$zShow FIFF tree.r   )Úsparser   rW   z = ú/ZFIFFB_)ro   FNTr4   c                 S   s   g | ]
}|j ‘qS r   )r7   ©re   rB   r   r   r   rp     s     z_show_tree.<locals>.<listcomp>r$   c                 S   s   g | ]
}|j ‘qS r   )rO   rw   r   r   r   rp   	  s     c                 S   s   g | ]
}|j ‘qS r   )r&   rw   r   r   r   rp   
  s     c                 S   s   g | ]
}|j ‘qS r   )r8   rw   r   r   r   rp     s     rd   Úxz: Ú z ... array size=z ... dict len=z ... str len=z ... list len=z ... sparse (%s) shape=%sz
 ... type=z>>>>>>>>>>>>>>>>>>>>BADz?%s?z (zb %s)r]   õ   Â¶Úchildren)Zscipyru   r,   r9   r;   rt   ÚstripÚ
startswithÚzipr   r   rI   r:   r^   ÚnpZndarrayr&   Údictrr   rP   ÚtupleÚissparseZ	getformatÚshaperO   r	   ÚgetÚreplacer_   )r   rA   rX   rY   rZ   r[   r\   ru   Zthis_idtZnext_idtrb   Z	tag_foundÚkindsÚtypesÚsizesZpossÚcounterZgoodrh   Úknr&   r8   r   rC   Z	this_typeÚprependZpostpendÚbranchr   r   r   r_   û   s”    ÿÿ


"ÿÿþþþý
ÿ
r_   )FN)$Úos.pathrD   r-   Úior   r   Úgzipr   Únumpyr   rC   r   r   r   r	   rA   r
   r   Ú	constantsr   Úutilsr   r   r   r   Úobjectr   r3   rG   rK   rH   Úinfr,   rc   rt   r_   r   r   r   r   Ú<module>   s*   +=  ÿ.