
    DUf8                       d dl mZ d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlZ	 d dlmZ n# e$ r eZY nw xY wd dlZd dlZd dlmZmZ d d	lmZ d
dlmZmZ d
dlmZmZ g dZdJdZ dKdZ!dLdZ" G d d          Z# G d de#          Z$	 dMdNd$Z%dOd'Z&dPd)Z'dQdRd-Z(dSd.Z)dTd0Z*dTd1Z+dUd2Z,dVd:Z-dWdXd<Z.dWdXd=Z/	 dYdZd?Z0d[dBZ1 G dC dDe          Z2 G dE dF          Z3d\dGZ4d]dHZ5d]dIZ6dS )^    )annotationsN)Callable)datetime)Number)AnyLiteral)JSONDecodeError)BoxStyleLeftAligned)	Traversal   )MAGICMAGIC_SCOOL)	natsortedparse_cooler_uri)	is_cooleris_multires_filelist_coolerscpmvlnoobjectreturnstrc                4    t          j        | dddd          S )z/Write JSON in a consistent, human-readable way.   T),z: )indent	sort_keysensure_ascii
separators)jsondumps)r   s    K/var/www/html/software/conda/lib/python3.11/site-packages/cooler/fileops.py
json_dumpsr&      s&    :	!t$;       sc                *    t          j        |           S )zRead JSON in a consistent way.)r#   loads)r(   s    r%   
json_loadsr+   %   s    :a==r'   obj,str | np.generic | np.ndarray | h5py.Dataset%str | Number | datetime | list | dictc                f   t          | d          r|                                 }nt          | d          r|                                 }nft          | t                    rO	 t          j        | d          }n:# t          $ r+ 	 t          j	        |           }n# t          $ r | }Y nw xY wY nw xY w| }|S )zf
    Decode a HDF5 attribute value (numpy object or string) into something
    JSON serializable.
    itemtolistz%Y-%m-%dT%H:%M:%S.%f)hasattrr0   r1   
isinstancer   r   strptime
ValueErrorr#   r*   r	   )r,   r   s     r%   decode_attr_valuer6   *   s     sF HHJJ	h		 JJLL	C		 		!#'=>>AA 	 	 	JsOO"   	 Hs6   !A7 7
B,BB,B&#B,%B&&B,+B,c                  0    e Zd Zddd	ZddZddZddZdS )TreeNoder   Nr,   r   depthintlevel
int | Nonec                0    || _         || _        || _        d S N)r,   r9   r;   )selfr,   r9   r;   s       r%   __init__zTreeNode.__init__C   s    



r'   r   r   c                4    t          | j                  j        S r>   )typer,   __name__r?   s    r%   get_typezTreeNode.get_typeH   s    DH~~&&r'   list[TreeNode]c                     t           j        d          rI j         j         j        k     r2 j        dz    j                                        } fd|D             S g S )Nvaluesr   c                J    g | ]}                     |j                    S ))r9   r;   )	__class__r;   ).0r   r9   r?   s     r%   
<listcomp>z)TreeNode.get_children.<locals>.<listcomp>P   s:       IJDNN1ENDD  r'   )r2   r,   r;   r9   rH   )r?   childrenr9   s   ` @r%   get_childrenzTreeNode.get_childrenK   s    48X&& 	z!TZ$*%<%<
Q8??,,    NV    	r'   c                    | j         j                            d          d         pd}t          | j         d          r|d| j         j         d| j         j         z  }|S )N/shape )r,   namesplitr2   rR   dtype)r?   rT   s     r%   get_textzTreeNode.get_textU   s_    x}""3''+2s48W%% 	:999999Dr'   )r   N)r,   r   r9   r:   r;   r<   r   r   )r   rF   )rC   
__module____qualname__r@   rE   rN   rW    r'   r%   r8   r8   B   si            
' ' ' '        r'   r8   c                      e Zd ZddZdS )AttrNoder   r   c                P    | j         j                            d          d         pdS )NrP   rQ   )r,   rT   rU   rD   s    r%   rW   zAttrNode.get_text]   s$    x}""3''+2s2r'   NrX   )rC   rY   rZ   rW   r[   r'   r%   r]   r]   \   s(        3 3 3 3 3 3r'   r]   group
h5py.Groupfunc/Callable[[str, h5py.Group | h5py.Dataset], Any]r;   r<   dict[str, Any]c                L    dfd	t          | |          } ||i           S )zALike :py:method:`h5py.Group.visititems`, but much faster somehow.Nc                    |                                  }|r:|D ]7} ||j        j        |j                  ||j        j        <    |||           8|S r>   )rN   r,   rT   )nodera   resultrM   child_visititemss        r%   ri   zvisititems.<locals>._visititemsh   sg    $$&& 	1! 1 1)-einei)H)Huy~&E40000r'   r;   r>   )r8   )r_   ra   r;   rootri   s       @r%   
visititemsrl   a   sI          E'''D;tT2&&&r'   grpboolc                      j                             dd           }|t          k    r<d}t           fd|D                       st	          j        d j         d           dS dS )Nformat)chromsbinspixelsindexesc              3  D   K   | ]}|                                 v V  d S r>   keys)rK   rT   rm   s     r%   	<genexpr>z_is_cooler.<locals>.<genexpr>x   s0      77$4388::%777777r'   zCooler path z appears to be corruptTF)attrsgetr   allwarningswarnrT   )rm   fmtrw   s   `  r%   
_is_coolerr   t   st    
)--$
'
'C
e||67777$77777 	KMIIIIJJJt5r'   uric                    t          |           \  }}t          j        |          sdS t          j        |          5 }t	          ||                   cddd           S # 1 swxY w Y   dS )z
    Determine if a URI string references a cooler data collection.
    Returns False if the file or group path doesn't exist.

    FN)r   h5pyis_hdf5Filer   )r   filepath	grouppathfs       r%   r   r   ~   s     +3//Hi<!! u	8		 (!I,''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s   AA#&A#r   min_versionr:   c                   t          j        |           sdS t          j        |           5 }|j                            dd          }d|                                v rt          |d                                                   dk    rdt          t          |d                                                             }|dk    r)t          |d         |                   r	 ddd           dS n?d|                                v r)t          |d                   r|d	k     r	 ddd           dS ddd           n# 1 swxY w Y   dS )
zg
    Determine if a file is a multi-res cooler file.
    Returns False if the file doesn't exist.

    Frp   Nresolutionsr   zHDF5::MCOOLT0   )
r   r   r   ry   rz   rw   lennextiterr   )r   r   r   r~   rT   s        r%   r   r      s    <!! u	8		 gkk(D))AFFHH$$Q}-=-B-B-D-D)E)E)I)IQ}-22445566Dm##
1]3CD3I(J(J#        AFFHH__AcF!3!3_a                       5s   B3D7+3D77D;>D;c                   t          j        |           st          d|  d          t          j        |           5 j                            dd          }|t          k    rd}t          fd|D                       s"t          j	        d           	 ddd           dS d	
                                v rt          d	         
                                          d
k    rTd	         
                                D ]+}t          d	         |                   s ddd           dS ,	 ddd           dS ddd           n# 1 swxY w Y   dS )zi
    Determine if a file is a single-cell cooler file.
    Returns False if the file doesn't exist.

    '' is not an HDF5 file.Frp   N)rq   rr   cellsc              3  D   K   | ]}|                                 v V  d S r>   rv   )rK   rT   r   s     r%   rx   z is_scool_file.<locals>.<genexpr>   s0      99Dtqvvxx'999999r'   z Scool file appears to be corruptr   r   T)r   r   OSErrorr   ry   rz   r   r{   r|   r}   rw   r   r   )r   r~   rw   r   r   s       @r%   is_scool_filer      s    <!! :(:::;;; 
8		 gkk(D))+.D9999D99999 @AAA        !&&((""s1W:??+<+<'='='A'AwZ__.. % %E%aj&788 %$       %                       5s   AE#A9E)EEE	list[str]c                   t          j        |           st          d|  d          g fd}t          j        | d          5 } |d|           t	          ||           ddd           n# 1 swxY w Y   t                    S )z
    List group paths to all cooler data collections in a file.

    Parameters
    ----------
    filepath : str

    Returns
    -------
    list
        Cooler group paths in the file.

    r   r   c                    t          |          r1                    |                     d          sd| z   n|            d S d S NrP   r   append
startswithpthrm   listings     r%   _check_coolerz#list_coolers.<locals>._check_cooler   O    c?? 	JNNCNN3,?,?H399SIIIII	J 	Jr'   rrP   N)r   r   r   r   rl   r   r   r   r   r   s      @r%   r   r      s     <!! <:(:::;;;GJ J J J J 
8S	!	! %Qc11m$$$% % % % % % % % % % % % % % % Ws   A..A25A2c                8   fd}t          |           rsg t          j        | d          5 } |d|           t          ||           ddd           n# 1 swxY w Y   dv r                    d           t                    S t          d|  d          )z
    List the paths to all single-cell cool matrices in a file scool file.

    Parameters
    ----------
    filepath : str

    Returns
    -------
    list
        Cooler group paths of all cells in the file.

    c                    t          |          r1                    |                     d          sd| z   n|            d S d S r   r   r   s     r%   r   z'list_scool_cells.<locals>._check_cooler   r   r'   r   rP   Nr   z' is not a scool file.)r   r   r   rl   remover   r   r   s      @r%   list_scool_cellsr      s   J J J J J X 	<Yx%% 	)M#q!!!q-(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) '>>NN3!!!:(:::;;;s   AAAc                &   t          |           \  }}t          j        |          st          d| d          g fd}t          j        |d          5 } |||           t          ||         |           ddd           n# 1 swxY w Y   S )z
    Get all groups and datasets in an HDF5 file.

    Parameters
    ----------
    uri : str

    Returns
    -------
    list
        Group and dataset paths.

    r   r   c                f                         |                     d          sd| z   n|            d S r   )r   r   r   s     r%   
_check_allzls.<locals>._check_all
  s4    s(;(;DsSyyEEEEEr'   r   N)r   r   r   r   r   rl   )r   r   r   r   r   r   s        @r%   lsr      s     +3//Hi<!! <:(:::;;;GF F F F F 
8S	!	! -Q
9a   1Y<,,,- - - - - - - - - - - - - - - Ns   #BB
B
src_uridst_uri	overwritelinkrename	soft_linkNonec                   t          |           \  }}t          |          \  }}	t          |||g          dk    rt          d          t          j                            |          r|rd}
nd}
||k    rd}nd}t          j        ||          5 }t          j        ||
          5 }||k    rF|s|r||         ||	<   |r||= n|rt          j        |          ||	<   n|	                    ||	           n|rt          d          |rt          j        ||          ||	<   n|	dk    rf||                                         D ]}|	                    |dz   |z   ||            ||	         j                            ||         j                   n|	                    |||	dk    r|	nd            d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr   z:Must provide at most one of: "link", "rename", "soft_link"wzr+r   z,Can't hard link between two different files.rP   )r   sumr5   ospathisfiler   r   SoftLinkcopyr   ExternalLinkrw   ry   update)r   r   r   r   r   r   src_path	src_groupdst_path	dst_groupdst_write_modesrc_write_modesrcdstsubgrps                  r%   _copyr     s    +733Hi*733Hi
D&)$%%))UVVV7>>(## y 8	8^	,	, V	8^	,	,V03x /v /!$YI 'I /!%y!9!9II.... 
VLMMM V!%!28Y!G!GI##"%i."5"5"7"7 H HS6!93GGGG	N(//I0DEEEEHHY)s:J:JYYPTUUU-V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V Vs7   G&DF6*G6F:	:G=F:	>GGGFc                0    t          | ||ddd           dS )zICopy a group or dataset from one file to another or within the same file.Fr   r   r   Nr   r   r   r   s      r%   r   r   E  s#    	'7IE%5QQQQQQr'   c                0    t          | ||ddd           dS )z/Rename a group or dataset within the same file.FTr   Nr   r   s      r%   r   r   J  s#    	'7IE$%PPPPPPr'   softc                2    t          | ||| d|           dS )zCreate a hard link to a group or dataset in the same file. Also
    supports soft links (in the same file) or external links (different files).
    Fr   Nr   )r   r   r   r   s       r%   r   r   O  s'     
'7IHUdSSSSSSr'   expandr   c                
   	 dd l n%# t          $ r}t          | d          d d }~ww xY wdd	 ddfd                                }t          | |          }|                     |d|                     |S )Nr   z: Run `pip install ipytree` or `conda install ipytree`to get the required ipytree dependency for displaying the tree widget. If using jupyterlab, you also need to run `jupyter labextension install ipytree`stype,Literal['Dataset', 'Array', 'Group', 'File']r   Literal['table', 'folder']c                >    | dv rdS | dv rdS t          d|            )N>   ArrayDatasettable>   r   GroupfolderzUnknown type: )r5   )r   s    r%   _tree_get_iconz#tree_widget.<locals>._tree_get_iconf  s=     (((7'''85e55666r'   Frf   r8   rk   rn   r   ipytree.Nodec                l                                    } |                                           |_        |s$du s t          t                    r| j        k     rd|_        nd|_        |                                 |_        fd| 	                                D             |_
        d|_        |S )NTFc                *    g | ]} |           S ))r   r[   )rK   c_tree_widget_sublistr   s     r%   rL   z=tree_widget.<locals>._tree_widget_sublist.<locals>.<listcomp>~  s7     
 
 
78  6222
 
 
r'   )NoderE   iconr3   r:   r9   openedrW   rT   rN   nodesdisabled)rf   rk   r   rg   r   r   ipytrees     ` r%   r   z)tree_widget.<locals>._tree_widget_sublistp  s     $nT]]__55	"t^^$$ $)-f)<)< FMM!FMmmoo
 
 
 
 
<@<M<M<O<O
 
 
 r'   rj   T)rk   r   )r   r   r   r   FF)rf   r8   rk   rn   r   rn   r   r   )r   ImportErrorTreer8   add_node)	r_   r   r;   errorrg   rk   r   r   r   s	         @@@r%   tree_widgetr   [  s        5 5 5
 

 	7 7 7 7 <A        * \\^^FE'''D
OO((DHHHIIIMs   
 
,',c                  &    e Zd ZddZddZdd	Zd
S )TreeTraversalrf   r8   r   rF   c                *    |                                 S r>   )rN   r?   rf   s     r%   rN   zTreeTraversal.get_children  s      """r'   treec                    |S r>   r[   r?   r   s     r%   get_rootzTreeTraversal.get_root  s    r'   r   c                *    |                                 S r>   )rW   r   s     r%   rW   zTreeTraversal.get_text  s    }}r'   N)rf   r8   r   rF   )r   r8   r   r8   )rf   r8   r   r   )rC   rY   rZ   rN   r   rW   r[   r'   r%   r   r     sP        # # # #        r'   r   c                  B    e Zd ZdZddefddZddZddZddZddZ	dS )
TreeViewera	  
    Generates ascii- or html-based reprs for "Groupy" objects.
    Borrowed with minor modifications from the zarr project
    (Zarr Developers, MIT-licensed).

    <https://github.com/zarr-developers/zarr>

    See: zarr.util.TreeViewer, zarr.util.tree_html

    FNr_   r`   r   rn   r;   r<   node_clsr   c                    || _         || _        || _        dddd| _        ddddd| _        dd	d
dd| _        || _        d S )Nr   r   )	horiz_lenlabel_spacer   +-|)UP_AND_RIGHT
HORIZONTALVERTICALVERTICAL_AND_RIGHTu   └u   ─u   │u   ├)r_   r   r;   text_kwargsbytes_kwargsunicode_kwargsr   )r?   r_   r   r;   r   s        r%   r@   zTreeViewer.__init__  sr     

)*1JJ  "%	
 
 %" "*	
 
 !r'   r   bytesc                    t          t                      t          dd| j        i| j                  }|                     | j        | j                  } ||          }|                                }|S Ngfx)traversedrawrj   r[   )	r   r   r
   r  r  r   r_   r;   encode)r?   drawerrk   rg   s       r%   	__bytes__zTreeViewer.__bytes__  su    "__DDd/D43CDD
 
 
 }}TZtz}:: r'   r   c                    t          t                      t          dd| j        i| j                  }|                     | j        | j                  } ||          S r  )r   r   r
   r  r  r   r_   r;   )r?   r  rk   s      r%   __unicode__zTreeViewer.__unicode__  sb    "__FFd1FT5EFF
 
 
 }}TZtz}::vd||r'   c                *    |                                  S r>   )r  rD   s    r%   __repr__zTreeViewer.__repr__  s    !!!r'   c                p    t          | j        | j        | j                  }|                                 |S )N)r   r;   )r   r_   r   r;   _repr_mimebundle_r   s     r%   r  zTreeViewer._repr_mimebundle_  s3    4:dkLLL   r'   )r_   r`   r   rn   r;   r<   r   r   )r   r  rX   )r   r   )
rC   rY   rZ   __doc__r8   r@   r  r  r  r  r[   r'   r%   r   r     s        	 	   ! ! ! ! !:      " " " "     r'   r   c                H    dfd	 t          | |          d          S )NFc                    | j         j        }dd |                                D             i}|                                 }|r%|D ]"} |          ||                                <   #|S )Nz@attrsc                4    i | ]\  }}|t          |          S r[   )r6   )rK   kvs      r%   
<dictcomp>z4read_attr_tree.<locals>._getdict.<locals>.<dictcomp>  s'    OOOAQ 1! 4 4OOOr'   )r,   ry   itemsrN   rW   )rf   rk   ry   rg   rM   rh   _getdicts         r%   r  z read_attr_tree.<locals>._getdict  sy    OOOOOP$$&& 	;! ; ;+38E??u~~''((r'   rj   T)rk   F)r]   )r_   r;   r  s     @r%   read_attr_treer    sE          8HU%000t<<<<r'   c                ,   ddl m} dd l}t          |           \  }}t	          j        |d          5 }||         } |            }|                    t          ||          |           |                                cd d d            S # 1 swxY w Y   d S )Nr   )StringIOr   )	ior   yamlr   r   r   dumpr  getvalue)	r   r;   r   r"  r   r_   r   rm   r(   s	            r%   pprint_attr_treer%    s    KKK"3''KD%	4		 hHJJ		.e,,a000zz||	                 s   A
B		BBc                    t          |           \  }}t          j        |d          5 }||         }t          t	          ||                    cd d d            S # 1 swxY w Y   d S )Nr   rj   )r   r   r   reprr   )r   r;   r   r_   r   rm   s         r%   pprint_data_treer(    s    "3''KD%	4		 2hJs%000112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2s   &AA"A)r   r   r   r   )r(   r   r   r   )r,   r-   r   r.   r>   )r_   r`   ra   rb   r;   r<   r   rc   )rm   r`   r   rn   )r   r   r   rn   )r   )r   r   r   r:   r   rn   )r   r   r   rn   )r   r   r   r   )r   r   r   r   )r   r   r   r   r   rn   r   rn   r   rn   r   rn   r   r   r  )r   r   r   r   r   rn   r   r   r   )
r   r   r   r   r   rn   r   rn   r   r   )r_   r`   r   rn   r;   r<   r   r   )r_   r`   r;   r<   r   rc   )r   r   r;   r<   r   r   )7
__future__r   r   r|   collections.abcr   r   numbersr   typingr   r   
simplejsonr#   r	   r   r5   r   numpynp	asciitreer
   r   asciitree.traversalr   creater   r   utilr   r   __all__r&   r+   r6   r8   r]   rl   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r%  r(  r[   r'   r%   <module>r5     s   " " " " " " 				  $ $ $ $ $ $                        !******* ! ! ! OOO!      + + + + + + + + ) ) ) ) ) ) & & & & & & & & - - - - - - - -
M
M
M      
   0       43 3 3 3 3x 3 3 3 ' ' ' ' '&   
( 
( 
( 
(    *   2   << < < <>   <.V .V .V .VbR R R R R
Q Q Q Q Q GLT T T T T. . . .b    I   E E E E E E E EP
= 
= 
= 
=
 
 
 
2 2 2 2 2 2s   5 ??