U
    vIÀdú  ã                   @   sÔ   d dl Z d dlmZ d dlmZmZ d dl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 d	d
lmZ ddlmZ eeƒZeddƒZdeeeedœdd„Zdeeedœdd„Zdd„ Zdd„ Z dS )é    N)ÚPath)ÚPathLikeÚfspath)Úissparseé   )ÚAnnData)Ú
get_logger)ÚWriteWarningé   )Ú
write_h5ad)Úimport_functionzanndata._io.zarrÚ
write_zarrTú,)ÚdirnameÚadataÚ	skip_dataÚsepc                 C   s°  t | ƒ} | jdkr|  d¡} t d| › �¡ |  ¡ sB| jddd� | d }| ¡ s`|jddd� t|j|j	|j
 ¡ |j ¡ d�}|s¨t t|jƒrœ|j ¡ n|j¡|d< ||j–}d}| ¡ D ]ì\}}	t|	ƒrä|r¾t d	t¡ d
}q¾| }
|dkrô|}
|
|› d� }
|	}t|	tjƒ�s�t |	¡}	t |	¡dk�r6|	d }	zt |	¡}W nJ tk
�rŽ } z*t d|›dt|ƒ› d�t¡ W Y ¢q¾W 5 d}~X Y nX |j|
||dk|dkd� q¾dS )z(See :meth:`~anndata.AnnData.write_csvs`.z.csvÚ zwriting .csv files to T)ÚparentsÚexist_okZuns)ÚobsÚvarÚobsmÚvarmÚXz$Omitting to write sparse annotation.F>   r   r   r   r   r   r   NzOmitting to write z	 of type Ú.>   r   r   r   r   >   r   r   )r   ÚheaderÚindex)r   ÚsuffixÚwith_suffixÚloggerÚinfoÚis_dirÚmkdirÚdictZ_obsZ_varZ_obsmZto_dfZ_varmÚpdZ	DataFramer   r   ZtoarrayZ_unsÚitemsÚwarningsÚwarnr	   Ú
isinstanceÚnpÚarrayÚndimÚ	ExceptionÚtypeZto_csv)r   r   r   r   Zdir_unsÚdZd_writeZnot_yet_raised_sparse_warningÚkeyÚvalueÚfilenameZdfÚe© r4   úJ/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/anndata/_io/write.pyÚ
write_csvs   s`    

ü$

þür6   F)r2   r   Úwrite_obsm_varmc                 C   s„  t | ƒ} dd„ |j d¡ ¡ D ƒ}|j}|jd k	r8|jnd}|j||< dd„ |j d¡ ¡ D ƒ}|j}|jd k	rv|jnd}|j||< |j	d kr–t
dƒ‚|rØ|j ¡ D ]}	|j|	 ||	< q¤|j ¡ D ]}	|j|	 ||	< qÂnHt|j ¡ ƒdksþt|j ¡ ƒdk�r t d	|j ¡ |j ¡ B › d
�¡ d|j	ji}
|j ¡ D ]}	|j|	 j|
|	< �q6ddlm} |  ¡ �rl|  ¡  |t| ƒ|
||d� d S )Nc                 S   s   i | ]\}}|t  |¡“qS r4   ©r*   r+   ©Ú.0ÚkÚvr4   r4   r5   Ú
<dictcomp>P   s      zwrite_loom.<locals>.<dictcomp>ÚlistÚ	var_namesc                 S   s   i | ]\}}|t  |¡“qS r4   r8   r9   r4   r4   r5   r=   T   s      Ú	obs_namesz-loompy does not accept empty matrices as datar   z&The loom file will lack these fields:
zA
Use write_obsm_varm=True to export multi-dimensional annotationsr   )Úcreate)Ú	row_attrsÚ	col_attrs)r   r   Úto_dictr&   r?   ÚnameÚvaluesr   r@   r   Ú
ValueErrorr   Úkeysr   Úlenr    ÚwarningÚTÚlayersZloompyrA   ÚexistsÚunlinkr   )r2   r   r7   rB   Z	row_namesZrow_dimrC   Z	col_namesZcol_dimr0   rL   rA   r4   r4   r5   Ú
write_loomN   s6    


&ÿ
rO   c                    s4   ‡ fdd„t tt tˆ jd ƒˆ jd  ¡ƒƒD ƒS )zb    Return all the indices (coordinates) for the chunks in a zarr array,
    even empty ones.
    c              	      s@   g | ]8}t tt tˆ jd  ƒˆ jd   ¡ƒƒD ]}||f‘q.qS )r
   ©ÚrangeÚintÚmathÚceilÚfloatÚshapeÚchunks)r:   ÚiÚj©Úzar4   r5   Ú
<listcomp>y   s   ( þz&_get_chunk_indices.<locals>.<listcomp>r   rP   rZ   r4   rZ   r5   Ú_get_chunk_indicess   s    
$þr]   c                 C   sâ   |dkr|| d d …< nÈt | ƒD ]¾}| jd |d  | jd |d d   }}| jd |d  | jd |d d   }}t|||||ƒ t|ƒr¸|||…||…f  ¡ | ||…||…f< q|||…||…f | ||…||…f< qd S )Nr   r   r
   )r]   rW   Úprintr   Ztodense)r[   r0   r1   ÚciÚs0Ze0Ús1Úe1r4   r4   r5   Ú_write_in_zarr_chunks€   s    ***rc   )Tr   )F)!r'   Úpathlibr   Úosr   r   Zpandasr%   rS   Únumpyr*   Zscipy.sparser   r   r   Úloggingr   Zanndata._warningsr	   Zh5adr   Z_write_h5adÚutilsr   Ú__name__r    r   ÚboolÚstrr6   rO   r]   rc   r4   r4   r4   r5   Ú<module>   s0   
   ÿ   ÿ6%