o
    Nrf8                     @  s  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zd dlmZ W n ey?   eZY n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d]ddZ d^ddZ!d_ddZ"G dd dZ#G dd de#Z$	d`dad'd(Z%dbd+d,Z&dcd.d/Z'ddded3d4Z(dfd5d6Z)dgd8d9Z*dgd:d;Z+dhd<d=Z,didEdFZ-djdkdHdIZ.djdkdJdKZ/	GdldmdMdNZ0dndQdRZ1G dSdT dTeZ2G dUdV dVZ3dodWdXZ4dpdYdZZ5dpd[d\Z6dS )q    )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                 C  s   t j| d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    r#   W/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/cooler/fileops.py
json_dumps   s   
r%   sc                 C  s
   t | S )zRead JSON in a consistent way.)r!   loads)r&   r#   r#   r$   
json_loads%   s   
r(   obj,str | np.generic | np.ndarray | h5py.Dataset%str | Number | datetime | list | dictc                 C  s   t | dr|  }|S t | dr|  }|S t| trDz	t| d}W |S  tyC   z	t	| }W Y |S  t
y?   | }Y nw Y |S 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)hasattrr,   r-   
isinstancer   r   strptime
ValueErrorr!   r'   r   )r)   r   r#   r#   r$   decode_attr_value*   s,   


r2   c                   @  s6   e Zd Zddd	d
ZdddZdddZdddZdS )TreeNoder   Nr)   r   depthintlevel
int | Nonec                 C  s   || _ || _|| _d S N)r)   r4   r6   )selfr)   r4   r6   r#   r#   r$   __init__C   s   
zTreeNode.__init__r   r   c                 C  s   t | jjS r8   )typer)   __name__r9   r#   r#   r$   get_typeH   s   zTreeNode.get_typelist[TreeNode]c                   sN   t jdr%jd u sjjk r%jd  j } fdd|D S g S )Nvaluesr   c                   s   g | ]}j | jd qS ))r4   r6   )	__class__r6   ).0r   r4   r9   r#   r$   
<listcomp>P   s    z)TreeNode.get_children.<locals>.<listcomp>)r.   r)   r6   r4   r@   )r9   childrenr#   rC   r$   get_childrenK   s   

zTreeNode.get_childrenc                 C  sB   | j jdd p
d}t| j dr|d| j j d| j j 7 }|S )N/shape )r)   namesplitr.   rI   Zdtype)r9   rK   r#   r#   r$   get_textU   s   zTreeNode.get_text)r   N)r)   r   r4   r5   r6   r7   r   r   )r   r?   )r<   
__module____qualname__r:   r>   rF   rM   r#   r#   r#   r$   r3   B   s
    


r3   c                   @  s   e Zd ZdddZdS )AttrNoder   r   c                 C  s   | j jdd p
dS )NrG   rH   )r)   rK   rL   r=   r#   r#   r$   rM   ]   s   zAttrNode.get_textNrN   )r<   rO   rP   rM   r#   r#   r#   r$   rQ   \   s    rQ   group
h5py.Groupfunc/Callable[[str, h5py.Group | h5py.Dataset], Any]r6   r7   dict[str, Any]c                   s&   d fdd	 t | |d} ||i S )zALike :py:method:`h5py.Group.visititems`, but much faster somehow.Nc                   s>   |   }|r|D ]}||jj|j||jj<  ||| q|S r8   )rF   r)   rK   )noderT   resultrE   child_visititemsr#   r$   r[   h   s   zvisititems.<locals>._visititemsr6   r8   )r3   )rR   rT   r6   rootr#   rZ   r$   
visititemsa   s   r^   grpboolc                   sL    j dd }|tkr$d}t fdd|D s"td j d dS dS )	Nformat)chromsbinsZpixelsZindexesc                 3      | ]	}|   v V  qd S r8   keysrB   rK   r_   r#   r$   	<genexpr>x       z_is_cooler.<locals>.<genexpr>zCooler path z appears to be corruptTF)attrsgetr   allwarningswarnrK   )r_   fmtrf   r#   rh   r$   
_is_coolert   s   rq   uric                 C  sT   t | \}}t|sdS t|}t|| W  d   S 1 s#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Filerq   )rr   filepath	grouppathfr#   r#   r$   r   ~   s   

$r   rv   min_versionr5   c                 C  s  t | sdS t | q}|jdd}d| v rDt|d  dkrDtt|d  }|dkrCt	|d | rC	 W d   dS n!d| v r]t	|d rm|d	k ru	 W d   dS W d   dS W d   dS W d   dS W d   dS 1 sw   Y  dS )
zg
    Determine if a file is a multi-res cooler file.
    Returns False if the file doesn't exist.

    Fra   Nresolutionsr   zHDF5::MCOOLT0   )
rs   rt   ru   rk   rl   rf   lennextiterrq   )rv   ry   rx   rp   rK   r#   r#   r$   r      s6   
  
	
	
	
		r   c                   s  t | std|  dt | r  jdd}|tkrld}t fdd|D s9t	d	 	 W d   dS d
 
 v rtt d
 
 dkr| d
 
 D ]}t d
 | sb W d   dS qO	 W d   dS W d   dS W d   dS W d   dS 1 sw   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.Fra   N)rb   rc   cellsc                 3  rd   r8   re   rg   rx   r#   r$   ri      rj   z is_scool_file.<locals>.<genexpr>z Scool file appears to be corruptr   r   T)rs   rt   OSErrorru   rk   rl   r   rm   rn   ro   rf   r}   rq   )rv   rp   rf   r   r#   r   r$   is_scool_file   s:   

 	


r   	list[str]c                   sx   t | std|  dg   fdd}t | d}|d| t|| W d   t S 1 s3w   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 |r | dsd|  n|  d S d S NrG   rq   append
startswithpthr_   Zlistingr#   r$   _check_cooler       z#list_coolers.<locals>._check_coolerrrG   N)rs   rt   r   ru   r^   r   rv   r   rx   r#   r   r$   r      s   


r   c                   s    fdd}t | r9g  t| d}|d| t|| W d   n1 s'w   Y  d v r5 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                   r   r   r   r   r   r#   r$   r      r   z'list_scool_cells.<locals>._check_coolerr   rG   Nr   z' is not a scool file.)r   rs   ru   r^   remover   r   r   r#   r   r$   list_scool_cells   s   

r   c                   s   t | \}}t|std| dg   fdd}t|d}||| t|| | W d    S 1 s9w   Y   S )z
    Get all groups and datasets in an HDF5 file.

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

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

    r   r   c                   s&     | dsd|   d S |  d S r   )r   r   r   r   r#   r$   
_check_all
  s   &zls.<locals>._check_allr   N)r   rs   rt   r   ru   r^   )rr   rv   rw   r   rx   r#   r   r$   ls   s   


r   src_uridst_uri	overwritelinkrename	soft_linkNonec              	   C  s  t | \}}t |\}}	t|||gdkrtdtj|r!|r$d}
nd}
||kr-d}nd}t||}t||
o}||krb|sE|rQ|| ||	< |rP||= nS|r[t|||	< nI|	||	 nB|rht
d|rst||||	< n1|	dkr||  D ]}|	|d | || q}||	 j|| j n|	|||	dkr|	nd  W d    n1 sw   Y  W d    d S W d    d S 1 sw   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.rG   )r   sumr1   ospathisfilers   ru   ZSoftLinkcopyr   ZExternalLinkrf   rk   update)r   r   r   r   r   r   Zsrc_pathZ	src_groupZdst_pathZ	dst_groupZdst_write_modeZsrc_write_modesrcdstZsubgrpr#   r#   r$   _copy  sD   
Pr   Fc                 C  s   t | ||d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   r#   r#   r$   r   E     r   c                 C  s   t | ||dddd dS )z/Rename a group or dataset within the same file.FTr   Nr   r   r#   r#   r$   r   J  r   r   softc                 C  s   t | ||| d|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   r#   r#   r$   r   O  s   r   expandr   c              
     s   zdd l W n ty } zt| dd d }~ww ddd 		dd fdd }t| |d}||d|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                 S  s&   | dv rdS | dv rdS t d|  )N>   ZDatasetZArraytable>   Groupru   folderzUnknown type: )r1   )r   r#   r#   r$   _tree_get_iconf  s
   z#tree_widget.<locals>._tree_get_iconFrW   r3   r]   r`   r   ipytree.Nodec                   sr     }|  |_|s du st tr| j k rd|_nd|_|  |_ fdd| 	 D |_
d|_|S )NTFc                   s   g | ]} |d qS )r   r#   )rB   c)_tree_widget_sublistr   r#   r$   rD   ~  s    z=tree_widget.<locals>._tree_widget_sublist.<locals>.<listcomp>)Noder>   iconr/   r5   r4   ZopenedrM   rK   rF   nodesdisabled)rW   r]   r   rX   r   r   ipytreer   r$   r   p  s    

z)tree_widget.<locals>._tree_widget_sublistr\   T)r]   r   )r   r   r   r   FF)rW   r3   r]   r`   r   r`   r   r   )r   ImportErrorZTreer3   add_node)rR   r   r6   errorrX   r]   r#   r   r$   tree_widget[  s"   
r   c                   @  s*   e Zd ZdddZddd	ZdddZdS )TreeTraversalrW   r3   r   r?   c                 C     |  S r8   )rF   r9   rW   r#   r#   r$   rF        zTreeTraversal.get_childrentreec                 C  s   |S r8   r#   r9   r   r#   r#   r$   get_root  s   zTreeTraversal.get_rootr   c                 C  r   r8   )rM   r   r#   r#   r$   rM     r   zTreeTraversal.get_textN)rW   r3   r   r?   )r   r3   r   r3   )rW   r3   r   r   )r<   rO   rP   rF   r   rM   r#   r#   r#   r$   r     s    

r   c                   @  sJ   e Zd ZdZddefdddZdddZdddZdddZd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

    FNrR   rS   r   r`   r6   r7   node_clsr   c                 C  sJ   || _ || _|| _dddd| _ddddd| _dd	d
dd| _|| _d S )Nr|   r   )Z	horiz_lenZlabel_spacer   +-|)ZUP_AND_RIGHTZ
HORIZONTALZVERTICALZVERTICAL_AND_RIGHTu   └u   ─u   │u   ├)rR   r   r6   text_kwargsbytes_kwargsunicode_kwargsr   )r9   rR   r   r6   r   r#   r#   r$   r:     s   
zTreeViewer.__init__r   bytesc                 C  sF   t t tdd| ji| jd}| j| j| jd}||}| }|S NZgfx)traverseZdrawr\   r#   )	r
   r   r	   r   r   r   rR   r6   encode)r9   drawerr]   rX   r#   r#   r$   	__bytes__  s   zTreeViewer.__bytes__r   c                 C  s:   t t tdd| ji| jd}| j| j| jd}||S r   )r
   r   r	   r   r   r   rR   r6   )r9   r   r]   r#   r#   r$   __unicode__  s   zTreeViewer.__unicode__c                 C  s   |   S r8   )r   r=   r#   r#   r$   __repr__  r   zTreeViewer.__repr__c                 C  s    t | j| j| jd}|  |S )N)r   r6   )r   rR   r   r6   _repr_mimebundle_r   r#   r#   r$   r     s   zTreeViewer._repr_mimebundle_)rR   rS   r   r`   r6   r7   r   r   )r   r   rN   )r   r   )
r<   rO   rP   __doc__r3   r:   r   r   r   r   r#   r#   r#   r$   r     s    


r   c                   s"   d fdd	  t | |dddS )NFc                   sH   | j j}ddd | D i}|  }|r"|D ]
} ||| < q|S )Nz@attrsc                 S  s   i | ]	\}}|t |qS r#   )r2   )rB   kvr#   r#   r$   
<dictcomp>  s    z4read_attr_tree.<locals>._getdict.<locals>.<dictcomp>)r)   rk   itemsrF   rM   )rW   r]   rk   rX   rE   rY   _getdictr#   r$   r     s   z read_attr_tree.<locals>._getdictr\   T)r]   F)rQ   )rR   r6   r#   r   r$   read_attr_tree  s   	r   c           	      C  sx   ddl m} dd l}t| \}}t|d}|| }| }|t||| | W  d    S 1 s5w   Y  d S )Nr   )StringIOr   )	ior   yamlr   rs   ru   dumpr   getvalue)	rr   r6   r   r   r   rR   rx   r_   r&   r#   r#   r$   pprint_attr_tree  s   $r   c                 C  sT   t | \}}t|d}|| }tt||dW  d    S 1 s#w   Y  d S )Nr   r\   )r   rs   ru   reprr   )rr   r6   r   rR   rx   r_   r#   r#   r$   pprint_data_tree  s
   $r   )r   r   r   r   )r&   r   r   r   )r)   r*   r   r+   r8   )rR   rS   rT   rU   r6   r7   r   rV   )r_   rS   r   r`   )rr   r   r   r`   )r   )rv   r   ry   r5   r   r`   )rv   r   r   r`   )rv   r   r   r   )rr   r   r   r   )r   r   r   r   r   r`   r   r`   r   r`   r   r`   r   r   r   )r   r   r   r   r   r`   r   r   r   )
r   r   r   r   r   r`   r   r`   r   r   )rR   rS   r   r`   r6   r7   r   r   )rR   rS   r6   r7   r   rV   )rr   r   r6   r7   r   r   )7
__future__r   r   rn   collections.abcr   r   numbersr   typingr   r   Z
simplejsonr!   r   r   r1   rs   numpynpZ	asciitreer	   r
   Zasciitree.traversalr   creater   r   utilr   r   __all__r%   r(   r2   r3   rQ   r^   rq   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#   r#   r#   r$   <module>   sZ    










1
1
H
