
    tf                     X    d dl Zd dlZd dlZd dlmZ d Zd Zd Zd
dZ	d Z
d Z	 dd	Zy)    N)abs2genomicc           
         t        | d      5 }t        |j                               }t        j                  d|dd       \  }}}}}d}g }t        |      D ]  }t        j                  d|||dz          d   }|dz  }t        j                  t              }	t        |      D ][  }
t        j                  d|||dz          \  }}|dz  }|d	z  dz  }d
d	|z   d}t        j                  |||||z          |	|<   ||z  }] t        j                  d|||dz          d   }|dd|z  z   z  }||	gz  } |cddd       S # 1 sw Y   yxY w)zLoad a reduced version of a bai index so that we can
    go through it and get a sense of how much data will be
    retrieved by a query.rbz<4cIN   z<I   r   z<II   <Q)	open	bytearrayreadstructunpackrangecoldefaultdictlist)index_filenamefb_n_refcindecesin_binbinsjbin_non_chunkbytes_to_read
unpack_strn_intvs                   ]/var/www/html/software/conda/envs/higlass/lib/python3.12/site-packages/clodius/tiles/tabix.pyload_bai_indexr%      sq    
nd	# qaffh$mmFAbqE:Aq!Uu 	AMM$!a!e5a8EFA??4(D5\ #$*MM%1q1u$F!Q '!a WQ/
%}}Z1q=?P9QRV]"# ]]41q1u6q9FQZAvG!	$ 5  s   D$D;;Ec                 P   t        j                  | d      5 }t        |j                               }t	        j
                  d|dd       \  }}}}}}}}}}	}
}d}||||z    j                  d      D cg c]  }|j                  d       }}||z  }g }t        |      D ]  }t	        j
                  d|||dz          d	   }|dz  }t        j                  t              }t        |      D ][  }t	        j
                  d
|||dz          \  }}|dz  }|dz  dz  }dd|z   d}t	        j
                  |||||z          ||<   ||z  }] t	        j
                  d|||dz          d	   }|dd|z  z   z  }||gz  } t        t        ||            cddd       S c c}w # 1 sw Y   yxY w)zLoad a reduced version of a tabix index so that we can
    go through it and get a sense of how much data will be
    retrieved by a query.r   z<4ciiiiiiiiN$       asciiz<ir   r   z<Iir   r   r	   r
   )gzipr   r   r   r   r   splitdecoder   r   r   r   dictzip)r   r   r   r   r   formatcol_seqcol_begcol_endmetaskipl_nmr   nnamesr   r   r   r   r   r   r    r!   r"   r#   s                            r$   load_tbi_idxr8   )   s    
>4	( *)Aaffh MM-3B0	
,-a!d(O,A,A%,HIq'"II	T	u 	AMM$!a!e5a8EFA??4(D5\ #$*MM%1q1u$F!Q '!a WQ/
%}}Z1q=?P9QRV]"# ]]41q1u6q9FQZAvG!	$ Cw'(U*) *)& J'*) *)s   AF2F
DFFF%c              #   V   K   t        dt        |       |      D ]  }| |||z      yw)z)Yield successive n-sized chunks from lst.r   N)r   len)lstr6   r   s      r$   chunksr<   Z   s2     1c#h" !a!ens   ')c              #      K   | |}} d||dz  z   |z   }}t        |dz         D ]J  }|| |z	  z   |||z	  z   }}||z
  dz   }	t        ||dz         D ]  }
|
 |	dz  }	 |d|dz  |z   z  z  }|dz  }L yw)a  
    generate key of bins which may overlap the given region,
    check out https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3042176/
    and https://samtools.github.io/hts-specs/tabix.pdf
    for more information.
    Parameters
    ----------
    begin: int
        chromosome position begin
    end: int
        chromosome position end
    n_lvls: int, optional
        cluster level, for tabix, set to 5
    min_shift: int, optional
        minimum shift, for tabix, set to 14
    Returns
    -------
    generator
    r         N)r   )beginendn_lvls	min_shifttslr   er6   ks              r$   reg2binsrI   `   s     ( 3Ei6Q;'&0qA6A: EQJcQh1EAIq!a% 	AGFA	 	
QAFa<  	Qs   A.A0c                     d}t        t        ||            D ]U  }d|cxk  rdk  sn | |   sd}t        | |   d      D ]*  }||d   dz	  |d   dz	  z
  z  }||d   dz	  |d   dz	  z
  z  }, W |S )Nr   iI  iH  r   r>      )r   rI   r<   )ixstartrA   
total_sizebinbin_sizechunks          r$   est_query_size_ixrR      s    JHUC() F3%#w#BsGQ/ FEqRE!HN CCH58r>eAh"n"EEJFF     c                 0    || vry| |   }t        |||      S )Nr   )rR   )indexnamerM   rA   rL   s        r$   est_query_sizerW      s%    5	tBR,,rS   c
           
      B   |	d}	|d   d|z  z  }
|r	|
|kD  rddiS d}||d   z  d|z  z  }|dz   |d   z  d|z  z  }t        t        |||            }g }|rL|D ]G  \  }}}|t        |      k\  r|j                  |   }|t	        ||t        |      t        |            z  }I d}||kD  rdd	| iS |D ]L  \  }}}|t        |      k\  r|j                  |   }| |t        |      t        |      t        |            z  }N t        |      |	kD  rdd
t        |       iS |S )Ni   	max_widthr   errorzTile too wider   r>   i@B zTile too large zToo many values in tile )r   r   r:   rU   rW   intstr)filenamer   
chromsizestsinfozxmax_tile_width	tbx_indexfetchermax_results
tile_width
query_size	start_posend_poscids_starts_endsret_valscidrM   rA   chromMAX_QUERY_SIZEs                        r$   single_indexed_tilero      s    $qAv-J*~5))JF;''!q&0I1u{++a1f4G K
IwGHH!1 	QS%c*o%$$S)E.E3u:s3xPPJ	Q NN"?:,788- >eS#j/!  %GCJE
CH==> 8}{"3CM?CDDOrS   )      )N)collectionsr   r*   r   clodius.tiles.bigwigr   r%   r8   r<   rI   rR   rW   ro    rS   r$   <module>ru      s<       ,B.)b@ -$ 7rS   