o
    Nrf_*                     @   sz   d dl Z d dlZd dlZd dlZd dlZd dlmZ ddej	fddZ
dd Zdd	 Zd
d Zdd Zdd Zdd ZdS )    N   )g    .Ac                 C   sB  ddl m} t|rt| t|d}d}t| }d| }	t	
t	|| t	d }
|jdddd	}||jd
< ||jd< ||jd< |
|jd< |d|
  |jd< || |}|| |}|| |} td|
|D ]}|jdt| t| fddd}|jdt| t| fddd}|jdt| t| fddd}|| | ||| ||| t| |	 dkr|| | d g|	t| |	   f} |||d g|	t||	   f}|||d g|	t||	   f}| |} | |}| |}||| d|	i} |tj|d|	i}|tj|d|	i}ql|  dS )a  
    Downsample a dataset so that it's compatible with HiGlass (filetype: hitile, datatype: vector)

    Parameters
    ----------
    old_data: np.array
        A numpy array containing the data to be downsampled
    filename: string
        The output filename where the resulting multi-resolution
        data will be stored.
    zoom_step: int
        The number of zoom levels to skip when aggregating
    r   Nwi      meta)   f)dtype	tile-size	zoom-step
max-lengthmax-zoomz	max-widthvalues_gzip)r   compressionmins_maxs_)Z
dask.arrayarrayopexistsosremoveh5pyFilelenmathceillogZcreate_datasetattrsZ
from_arrayrangeZrequire_datasetstrstoreconcatenateZrechunkZcoarsennpminmaxclose)Zold_datafilename	zoom_stepchunksZagg_functiondaZf_new	tile_sizemax_posZzoom_factormax_zoomr   Zmin_dataZmax_datazZvalues_dsetZ	mins_dsetZ	maxs_dset r/   ]/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/clodius/tiles/hitile.pyarray_to_hitile	   s`   









r1   c                 C   X   t | | dkrt| | d g|t | |   f} | tt | | |fjddS Nr   r   r   )Zaxis)r   r#   r"   reshaper   r   suma
num_to_aggr/   r/   r0   	aggregaten      $$r9   c                 C   r2   r3   )r   r#   r"   r4   r   r   r$   r6   r/   r/   r0   aggregate_minu   r:   r;   c                 C   r2   r3   )r   r#   r"   r4   r   r   r%   r6   r/   r/   r0   aggregate_max|   r:   r<   c                 C   s  |d| krt d g g g fS |dk rt d g g g fS | d }t|jd }t|jd }t|jd }|d|  }d	|jv rHt|jd	 }n|}|| }	|t|	|  }
|	|
 }d| }|| }t|d|  | }t|| }t|d|
  }| d
tt|
  }| dtt|
  }| dtt|
  }||krt|| }|tj	 t|| }|tj	 t
|t|}t|t|}nz||k r||k r||| dd }tj	||d |< ||| dd }tj	||d |< ||| dd }tj	||d |< t
|t|}t|t|}t|t|}n!t
||| t|}t||| t|}t||| t|}d}dtt|
 | v r| dtt|
  }t
||| t|}d||  }tt|}|| || }|| }|||fS |||fS )z
    Return a tile from an hdf_file.

    :param hdf_file: A file handle for an HDF5 file (h5py.File('...'))
    :param z: The zoom level
    :param x: The x position of the tile
    r   zOUT OF RIGHT RANGEr   zOUT OF LEFT RANGEr   r	   r
   r   zmax-positionr   r   r   Nr   Znan_values_)printintr   r   floorr    r#   Zzerosfillnanr9   r;   r<   r   )hdf_filer.   xdr+   r(   r-   	max_widthZmax_positionZrzZnext_stored_zoomZzoom_offsetr8   Ztotal_in_length	start_posend_posr   Zf_minZf_maxr7   Za_minZ	ret_arrayZ	min_arrayZa_maxZ	max_arrayZf_nanZ	nan_arrayZnum_aggregatedZnum_vals_arrayZnum_summed_arrayZaverages_arrayr/   r/   r0   get_data   sp   







rH   c              	   C   s   t | d}|d }d|jv r|jd }nd}d|jv r"|jd }n|jd }t|gt|gdtt|| td  t|jd t|jd	 d
S )aI  
    Get the tileset info for a hitile file.

    Parameters
    ----------
    hitile_path: string
        The path to the hitile file

    Returns
    -------
    tileset_info: {'min_pos': [],
                    'max_pos': [],
                    'tile_size': 1024,
                    'max_zoom': 7
                    }
    rr   zmin-posr   zmax-posr   r   r   r	   )r,   min_posrE   r-   r+   )r   r   r   r>   r   r   r   )Zhitile_pathrB   rD   rJ   r,   r/   r/   r0   tileset_info   s   


 rK   c           
      C   s   g }|D ]L}| d}ttt|dd }tt| |d |d \}}}	 t|	d
dt|	d
dt|	d
ddd}	|||	fg7 }q|S )a  
    Generate tiles from a hitile 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

    Returns
    -------
    tile_list: [(tile_id, tile_data),...]
        A list of tile_id, tile_data tuples
    .r      r   Zfloat32zutf-8)denseminsmaxsr   )splitlistmapr>   rH   r   r   base64	b64encodeZastypedecode)
filepathZtile_idsZgenerated_tilesZtile_idZtile_id_partsZtile_positionrN   rO   rP   Z
tile_valuer/   r/   r0   tiles  s   

rX   )rT   r   r   numpyr#   r   Zos.pathpathr   r5   r1   r9   r;   r<   rH   rK   rX   r/   r/   r/   r0   <module>   s    
es(