o
    Nrf)                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dl	m
  mZ ddlmZmZ d dlmZ dZdZdZd ZeeZi Zddded< dd	d
Zdd Z				dddZi dfddZ
dd ZdS )    N   )abs2genomicget_quadtree_depth)ThreadPoolExecutorsignificant   ZSignificant)namevaluec                 C   s   t | |}t|d< |S )Nrange_modes)hgbitileset_infor
   )bbpath
chromsizesti r   ]/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/clodius/tiles/bigbed.pyr      s   r   c              
      sl  | \	}}}}}}}}}		 z$|j | }
ttj||
||	}|dkr(| | }}n| | }}W n ty=   d\}}Y n tyI   d\}}Y nw d}d}i }|D ]}|||j | < ||7 }|d7 }qRg }d}g }|sn|S |D ]"}z|t|d  W n t	tfy   |t
 Y nw |d7 }qp||kr||kr|D ]+}zt|d }|||
 ||d W q t	tfy   |||
 t
|d Y qw |S ||kr4g  || }tt|d| }|D ]5}zt|d }||kr ||
 ||d W q t	tfy   t
|kr ||
 t
|d Y qw t }||kr4tt||} fddt|D }|S )	Nr   )NNr   r      )Z	chrOffsetZ
importancefieldsc                    s   g | ]} | qS r   r   ).0iZthresholded_intervalsr   r   
<listcomp>       zfetch_data.<locals>.<listcomp>)indexftpartialbbiZfetch_intervals
IndexErrorKeyErrorappendint
ValueErrorDEFAULT_SCOREnpZquantilelenrandomsamplerangesorted)ar   binsizer   
range_modemin_elementsmax_elementsZcidstartendZchromZfetch_factoryZ	intervalsZ
intervals2offsetZ	offsetIdxZ
chrOffsetsZchrSizeZfinal_intervalsZintervals_lengthZscoresintervalZscoreZdesired_percZthresholded_scoreZthresholded_intervals_lengthindicesr   r   r   
fetch_data   s   *


&

	
r3   c                    s   d u r	t  d u rtd u rtt }|| tt||}	tdd}
t|
t	 fdd|	D }W d    n1 sJw   Y  dd |D }dd |D S )N   )max_workersc              	      s(   g | ]}t  gt| qS r   )tuplelistr   cr   r*   r   r-   r,   r+   r   r   r      s    z#get_bigbed_tile.<locals>.<listcomp>c                 S   s   g | ]}|g kr|qS r   r   )r   xr   r   r   r          c                 S   s   g | ]	}|D ]}|qqS r   r   )r   Zsublistitemr   r   r   r      s    )
r   get_chromsizesMIN_ELEMENTSMAX_ELEMENTSZget_zoom_resolutionsr7   r   r   mapr3   )r   
zoom_level	start_posend_posr   r+   r,   r-   resolutionsZcids_starts_endseZarraysresultsr   r:   r   get_bigbed_tile   s*   


rH   c                 C   s  d}d}g }|D ]}| ddd }| dd }	|	 d}
ttt|
dd }t|
dkr4|
d nt}|tv r<|nd}tdd	 |D }d
|v rQt|d
 }d|v r[t|d }||krf|}|}|}n
||krp|}|d }|dkrxt}t	}|rdd	 |D }dd	 |D }t
j||d}nd}d|v r|d }||v r|| }nd}|d }|d }|du rt| }t|tj}tjd||   }|| }|| }t| |||||||d}|||fg7 }q|S )a  
    Generate tiles from a bigbed file.

    Parameters
    ----------
    tileset: tilesets.models.Tileset object
        The tileset that the tile ids should be retrieved from
    tile_ids: [str,...]
        A list of tile_ids (e.g. xyx.0.0) identifying the tiles
        to be retrieved
    chromsizes_map: {uid: []}
        A set of chromsizes listings corresponding to the parameters of the
        tile_ids. To be used if a chromsizes id is passed in with the tile id
        with the `|cos:id` tag in the tile id
    chromsizes: [[chrom, size],...]
        A 2d array containing chromosome names and sizes. Overrides the
        chromsizes in chromsizes_map

    Returns
    -------
    tile_list: [(tile_id, tile_data),...]
        A list of tile_id, tile_data tuples
    |r   Nr   .   c                 S   s   g | ]}| d qS ):)split)r   or   r   r   r     s    ztiles.<locals>.<listcomp>minmaxc                 S   s   g | ]}|d  qS )r   r   r8   r   r   r   r      r   c                 S   s   g | ]}t |d  qS )r   )r    r8   r   r   r   r   !  r<   )r   cos   )r+   r,   r-   )rN   r7   rA   r    r$   DEFAULT_RANGE_MODEr
   dictr?   r@   pdZSeriesr   r>   r   Z	TILE_SIZErH   )r   Ztile_idsZchromsizes_mapr   r,   r-   Zgenerated_tilesZtile_idZtile_option_partsZtile_no_optionsZtile_id_partsZtile_positionreturn_valuer+   Ztile_optionsZtemp_min_elementsZ
chromnamesZchromlengthsZchromsizes_to_useZchromsizes_idrB   Ztile_pos	max_depthZ	tile_sizerC   rD   Z
tile_valuer   r   r   tiles   sp   


rY   c                 C   s
   t | S N)r   r   )filenamer   r   r   r   I  s   
r   rZ   )NNNN)r   	functoolsr   loggingnumpyr#   ZpandasrV   r%   Zclodius.tiles.bigwigrY   Zbigwigr   utilsr   r   concurrent.futuresr   rT   r?   r@   r"   	getLogger__name__loggerr
   r   r3   rH   r   r   r   r   r   <module>   s4    

 
1e