
    tf8                       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 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Z d*dZ!	 	 	 	 d+dZ" G d d      Z# G d de#      Z$	 d,	 	 	 	 	 	 	 d-dZ%d.dZ&d/dZ'd0d1dZ(d2dZ)d3dZ*d3dZ+d4dZ,	 	 	 	 	 	 	 	 	 	 	 	 	 	 d5dZ-d6d7dZ.d6d7dZ/	 d8	 	 	 	 	 	 	 	 	 d9d Z0d:d!Z1 G d" d#e      Z2 G d$ d%      Z3d;d&Z4d<d'Z5d<d(Z6y# e$ r eZY w xY w)=    )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lnc                6    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)os    X/var/www/html/software/conda/envs/higlass/lib/python3.12/site-packages/cooler/fileops.py
json_dumpsr#      s    ::	!t$;     c                ,    t        j                  |       S )zRead JSON in a consistent way.)r   loads)ss    r"   
json_loadsr(   %   s    ::a=r$   c                D   t        | d      r| j                         }|S t        | d      r| j                         }|S t        | t              r	 t        j                  | d      }|S | }|S # t        $ r, 	 t        j                  |       }n# t        $ r | }Y nw xY wY |S w xY w)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+   
isinstancestrr   strptime
ValueErrorr   r&   r	   )objr!   s     r"   decode_attr_valuer2   *   s     sFHHJ H 
h	JJL H 
C		!!#'=>A H H  	JJsO"  H	s6   A* *	B4B
	B
BBBBBc                  .    e Zd ZdddZddZd	dZddZy)
TreeNodeNc                .    || _         || _        || _        y N)r1   depthlevel)selfr1   r7   r8   s       r"   __init__zTreeNode.__init__C   s    

r$   c                @    t        | j                        j                  S r6   )typer1   __name__r9   s    r"   get_typezTreeNode.get_typeH   s    DHH~&&&r$   c                0   t        | j                  d      rz| j                  | j                  | j                  k  rU| j                  dz   }| j                  j	                         }|D cg c]   }| j                  ||| j                        " c}S g S c c}w )Nvaluesr   )r7   r8   )r,   r1   r8   r7   rA   	__class__)r9   r7   childrenr!   s       r"   get_childrenzTreeNode.get_childrenK   s}    488X&zz!TZZ$**%<

Q88??,NVIJDNN1END  	s   )%Bc                    | j                   j                  j                  d      d   xs d}t        | j                   d      r3|d| j                   j                   d| j                   j
                   z  }|S )N/shape )r1   namesplitr,   rH   dtype)r9   rJ   s     r"   get_textzTreeNode.get_textU   s`    xx}}""3'+2s488W%a'q(899Dr$   )r   N)r1   r   r7   intr8   
int | Nonereturnr.   )rQ   list[TreeNode])r=   
__module____qualname__r:   r?   rD   rM    r$   r"   r4   r4   B   s    
'r$   r4   c                      e Zd ZddZy)AttrNodec                Z    | j                   j                  j                  d      d   xs dS )NrF   rG   )r1   rJ   rK   r>   s    r"   rM   zAttrNode.get_text]   s%    xx}}""3'+2s2r$   NrP   )r=   rS   rT   rM   rU   r$   r"   rW   rW   \   s    3r$   rW   c                >    dfd	t        | |      } ||i       S )zALike :py:method:`h5py.Group.visititems`, but much faster somehow.c                    | j                         }|rO|D ]J  } ||j                  j                  |j                        ||j                  j                  <    |||       L |S r6   )rD   r1   rJ   )nodefuncresultrC   child_visititemss        r"   r_   zvisititems.<locals>._visititemsh   s[    $$&! 1)-eiinneii)Huyy~~&E401 r$   r8   r6   )r4   )groupr\   r8   rootr_   s       @r"   
visititemsrc   a   s%     E'DtT2&&r$   c                      j                   j                  dd       }|t        k(  r:d}t         fd|D              s#t	        j
                  d j                   d       yy)Nformat)chromsbinspixelsindexesc              3  B   K   | ]  }|j                         v   y wr6   keys).0rJ   grps     r"   	<genexpr>z_is_cooler.<locals>.<genexpr>x   s     7$4388:%7   zCooler path z appears to be corruptTF)attrsgetr   allwarningswarnrJ   )rn   fmtrl   s   `  r"   
_is_coolerrw   t   sQ    
))--$
'C
e|67$77MML
2HIJr$   c                    t        |       \  }}t        j                  |      syt        j                  |      5 }t	        ||         cddd       S # 1 sw Y   yxY w)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Filerw   )urifilepath	grouppathfs       r"   r   r   ~   sQ     +3/Hi<<!	8	 (!I,'( ( (s   AAc                   t        j                  |       syt        j                  |       5 }|j                  j	                  dd      }d|j                         v rdt        |d   j                               dkD  rEt        t        |d   j                                     }|dk(  rJt        |d   |         r9	 ddd       yd|j                         v rt        |d         r|d	k  r
	 ddd       yddd       y# 1 sw Y   yxY w)
zg
    Determine if a file is a multi-res cooler file.
    Returns False if the file doesn't exist.

    Fre   Nresolutionsr   zHDF5::MCOOLT0   )
ry   rz   r{   rq   rr   rl   lennextiterrw   )r}   min_versionr   rv   rJ   s        r"   r   r      s     <<!	8	 ggkk(D)AFFH$Q}-=-B-B-D)E)IQ}-22456Dm#
1]3CD3I(J  AFFH_AcF!3a    s   B
C7?&C77D c                2   t        j                  |       st        d|  d      t        j                  |       5 j                  j                  dd      }|t        k(  rd}t        fd|D              st        j                  d       	 ddd       yd	j                         v r\t        d	   j                               d
kD  r=d	   j                         D ]  }t        d	   |         r ddd       y 	 ddd       yddd       y# 1 sw Y   yxY w)zi
    Determine if a file is a single-cell cooler file.
    Returns False if the file doesn't exist.

    '' is not an HDF5 file.Fre   N)rf   rg   cellsc              3  B   K   | ]  }|j                         v   y wr6   rk   )rm   rJ   r   s     r"   ro   z is_scool_file.<locals>.<genexpr>   s     9Dtqvvx'9rp   z Scool file appears to be corruptr   r   T)ry   rz   OSErrorr{   rq   rr   r   rs   rt   ru   rl   r   rw   )r}   rv   rl   r   r   s       @r"   is_scool_filer      s    <<!(#9:;; 
8	 ggkk(D)+.D9D99@A  !&&("s1W:??+<'='AwZ__. %E%aj&78$ %     s   ADAD/D9DDc                   t        j                  |       st        d|  d      g fd}t        j                  | d      5 } |d|       t	        ||       ddd       t              S # 1 sw Y   t              S xY w)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                l    t        |      r(j                  | j                  d      sd| z   n|        y y NrF   rw   append
startswithpthrn   listings     r"   _check_coolerz#list_coolers.<locals>._check_cooler   ,    c?NNCNN3,?39SI r$   rrF   N)ry   rz   r   r{   rc   r   r}   r   r   r   s      @r"   r   r      s     <<!(#9:;;GJ 
8S	! %Qc11m$% W	% Ws   A,,A?c                   fd}t        |       rVg t        j                  | d      5 } |d|       t        ||       ddd       dv rj	                  d       t              S t        d|  d      # 1 sw Y   8xY w)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                l    t        |      r(j                  | j                  d      sd| z   n|        y y r   r   r   s     r"   r   z'list_scool_cells.<locals>._check_cooler   r   r$   r   rF   Nr   z' is not a scool file.)r   ry   r{   rc   remover   r   r   s      @r"   list_scool_cellsr      s    J XYYx% 	)#q!q-(	) '>NN3!!(#9:;;	) 	)s   A77B c                   t        |       \  }}t        j                  |      st        d| d      g fd}t        j                  |d      5 } |||       t        ||   |       ddd       S # 1 sw Y   S xY w)z
    Get all groups and datasets in an HDF5 file.

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

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

    r   r   c                ^    j                  | j                  d      s
d| z          y |        y r   )r   r   r   s     r"   
_check_allzls.<locals>._check_all
  s#    s(;sSyEEr$   r   N)r   ry   rz   r   r{   rc   )r|   r}   r~   r   r   r   s        @r"   lsr      s     +3/Hi<<!(#9:;;GF 
8S	! -Q9a 1Y<,- N	- Ns   A44A>c                T   t        |       \  }}t        |      \  }}	t        |||g      dkD  rt        d      t        j                  j                  |      r|rd}
nd}
||k(  rd}nd}t        j                  ||      5 }t        j                  ||
      5 }||k(  r@|s|r||   ||	<   |r||= n|rt        j                  |      ||	<   n|j                  ||	       n|rt        d      |rt        j                  ||      ||	<   n||	dk(  r]||   j                         D ]  }|j                  |dz   |z   ||        ||	   j                  j                  ||   j                         n|j                  |||	dk7  r|	nd        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   z:Must provide at most one of: "link", "rename", "soft_link"wzr+r   z,Can't hard link between two different files.rF   )r   sumr0   ospathisfilery   r{   SoftLinkcopyr   ExternalLinkrl   rq   update)src_uridst_uri	overwritelinkrename	soft_linksrc_path	src_groupdst_path	dst_groupdst_write_modesrc_write_modesrcdstsubgrps                  r"   _copyr     s    +73Hi*73Hi
D&)$%)UVV77>>(#y8	8^	, V	8^	,V03xv!$YII!%y!9II.LMM!%!2!28Y!GI#"%i."5"5"7 HS6!93GH	N((//I0D0DEHHY)s:JYPTU-V V V V V Vs%   ?FC+FFF	FF'c                &    t        | ||ddd       y)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Qr$   c                &    t        | ||ddd       y)z/Rename a group or dataset within the same file.FTr   Nr   r   s      r"   r   r   J  s    	'7IE$%Pr$   c                (    t        | ||| d|       y)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   softr   s       r"   r   r   O  s     
'7IHUdSr$   c                    	 dd l 	 	 	 	 dd	 d		 	 	 	 	 	 	 d
fdj                         }t        | |      }|j	                   |d|             |S # t        $ r}t        | d      d d }~ww xY w)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`c                2    | dv ry| dv ryt        d|        )N>   ArrayDatasettable>   r{   GroupfolderzUnknown type: )r0   )stypes    r"   _tree_get_iconz#tree_widget.<locals>._tree_get_iconf  s.     ((''~eW566r$   c                ^   j                         } | j                               |_        |s#|du st        |t              r| j
                  |k  rd|_        nd|_        | j                         |_        | j                         D cg c]  } ||       c}|_
        d|_        |S c c}w )NTF)expand)Noder?   iconr-   rN   r7   openedrM   rJ   rD   nodesdisabled)r[   rb   r   r]   cr   _tree_widget_sublistipytrees        r"   r   z)tree_widget.<locals>._tree_widget_sublistp  s     $T]]_5Vt^$f)< FM!FMmmo<@<M<M<O
78 62
 
s   B*r`   T)rb   r   )r   z,Literal['Dataset', 'Array', 'Group', 'File']rQ   zLiteral['table', 'folder']FF)r[   r4   rb   boolr   r   rQ   zipytree.Node)r   ImportErrorTreer4   add_node)	ra   r   r8   errorr]   rb   r   r   r   s	         @@@r"   tree_widgetr   [  s    7;7	#7 <A"48	* \\^FE'D
OO(DHIMW  g 5 5

 	s   A 	A8$A33A8c                  $    e Zd ZddZddZddZy)TreeTraversalc                "    |j                         S r6   )rD   r9   r[   s     r"   rD   zTreeTraversal.get_children  s      ""r$   c                    |S r6   rU   r9   trees     r"   get_rootzTreeTraversal.get_root  s    r$   c                "    |j                         S r6   )rM   r   s     r"   rM   zTreeTraversal.get_text  s    }}r$   N)r[   r4   rQ   rR   )r   r4   rQ   r4   )r[   r4   rQ   r.   )r=   rS   rT   rD   r   rM   rU   r$   r"   r   r     s    #r$   r   c                  N    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	y)
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

    FNc                    || _         || _        || _        dddd| _        ddddd| _        dd	d
dd| _        || _        y )Nr   r   )	horiz_lenlabel_spacer   +-|)UP_AND_RIGHT
HORIZONTALVERTICALVERTICAL_AND_RIGHTu   └u   ─u   │u   ├)ra   r   r8   text_kwargsbytes_kwargsunicode_kwargsnode_cls)r9   ra   r   r8   r   s        r"   r:   zTreeViewer.__init__  sa     

)*1J  "%	
 %" "*	
 !r$   c                    t        t               t        dd| j                  i| j                        }| j                  | j                  | j                        } ||      }|j                         }|S Ngfx)traversedrawr`   rU   )	r   r   r
   r   r   r   ra   r8   encode)r9   drawerrb   r]   s       r"   	__bytes__zTreeViewer.__bytes__  sd    "_Dd//D43C3CD
 }}TZZtzz}: r$   c                    t        t               t        dd| j                  i| j                        }| j                  | j                  | j                        } ||      S r   )r   r   r
   r   r   r   ra   r8   )r9   r   rb   s      r"   __unicode__zTreeViewer.__unicode__  sS    "_Fd11FT5E5EF
 }}TZZtzz}:d|r$   c                "    | j                         S r6   )r  r>   s    r"   __repr__zTreeViewer.__repr__  s    !!r$   c                ~    t        | j                  | j                  | j                        }|j	                          |S )N)r   r8   )r   ra   r   r8   _repr_mimebundle_r   s     r"   r  zTreeViewer._repr_mimebundle_  s-    4::dkkL r$   )ra   
h5py.Groupr   r   r8   rO   r   r   )rQ   bytesrP   )rQ   r   )
r=   rS   rT   __doc__r4   r:   r   r  r  r  rU   r$   r"   r   r     sQ    	   !! ! 	!
 !:"r$   r   c                :    dfd	 t        | |      d      S )Nc           	        | j                   j                  }d|j                         D ci c]  \  }}|t        |       c}}i}| j	                         }|r |D ]  } |      ||j                         <    |S c c}}w )Nz@attrs)r1   rq   itemsr2   rD   rM   )	r[   rb   rq   kvr]   rC   r^   _getdicts	           r"   r  z read_attr_tree.<locals>._getdict  sz    OAQ 1! 44OP$$&! ;+3E?u~~'(; Ps   A;r`   T)rb   F)rW   )ra   r8   r  s     @r"   read_attr_treer    s     HU%0t<<r$   c                    ddl m} dd l}t        |       \  }}t	        j
                  |d      5 }||   } |       }|j                  t        ||      |       |j                         cd d d        S # 1 sw Y   y xY w)Nr   )StringIOr   )	ior  yamlr   ry   r{   dumpr  getvalue)	r|   r8   r  r  r   ra   r   rn   r'   s	            r"   pprint_attr_treer    si    "3'KD%	4	 hJ		.e,a0zz|	  s   8A11A:c                    t        |       \  }}t        j                  |d      5 }||   }t        t	        ||            cd d d        S # 1 sw Y   y xY w)Nr   r`   )r   ry   r{   reprr   )r|   r8   r   ra   r   rn   s         r"   pprint_data_treer    sM    "3'KD%	4	 2hJs%012 2 2s   A

A)r!   objectrQ   r.   )r'   r.   rQ   r  )r1   z,str | np.generic | np.ndarray | h5py.DatasetrQ   z%str | Number | datetime | list | dictr6   )ra   r  r\   z/Callable[[str, h5py.Group | h5py.Dataset], Any]r8   rO   rQ   dict[str, Any])rn   r  rQ   r   )r|   r.   rQ   r   )r   )r}   r.   r   rN   rQ   r   )r}   r.   rQ   r   )r}   r.   rQ   	list[str])r|   r.   rQ   r  )r   r.   r   r.   r   r   r   r   r   r   r   r   rQ   Noner  )r   r.   r   r.   r   r   rQ   r  r   )
r   r.   r   r.   r   r   r   r   rQ   r  )ra   r  r   r   r8   rO   rQ   r   )ra   r  r8   rO   rQ   r  )r|   r.   r8   rO   rQ   r.   )7
__future__r   r   rt   collections.abcr   r   numbersr   typingr   r   
simplejsonr   r	   r   r0   ry   numpynp	asciitreer
   r   asciitree.traversalr   creater   r   utilr   r   __all__r#   r(   r2   r4   rW   rc   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  rU   r$   r"   <module>r+     s   " 	  $    !*   + ) & -
M
	5*0 43x 3 ''
9' ' 	'&
(*2<<><.V.V.V .V 	.V
 .V .V 
.VbR
Q GLTTT&*T?CT	T.bI E EP
=
2S  ! O!s   C> >DD