U
    vIÀd²=  ã                   @   sÐ  d dl mZ d dlmZmZ d dlmZ d dlmZm	Z	m
Z
mZ d dlmZmZmZ d dlmZ d dlZd dlZd dl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# zddl$m%Z% W n0 e&k
�r Z' ze'Z(dd„ Z%W 5 dZ'['X Y nX d?eeee) f e	e) e	e* e)edœdd„Z+d@eee)e,f e)edœdd„Z-dAeedœdd„Z.ee)edœdd „Z/e
e)e
e)ee) f eej0e
e)ej1f f d!œd"d#„Z2ed$d%�d&d'd(d)dd*ddei ƒei ƒd+œ
ee*e*e)e)e	e
e)ee) f  e)e	e
e)ee) f  e)e
e)ee) f e
e)ee) f ed,œd-d.„ƒZ3dBee)ed/œd0d1„Z4dCeeee) f e	e) e	e* e)edœd2d3„Z5ee) ee)ddf d4œd5d6„Z6ee) e	e) e	e* e)ed7œd8d9„Z7dDd;d<„Z8d=d>„ Z9dS )Eé    )ÚPath)ÚPathLikeÚfspath)ÚMappingProxyType)ÚUnionÚOptionalÚMappingÚTuple)ÚIterableÚIteratorÚ	Generator)ÚOrderedDictN)Úwarn)Úsparseé   )ÚAnnData)Ú_deprecate_positional_argsé   )Úis_float)Ú	read_h5ad)Ú	read_zarrc                  O   s   t ‚d S )N)Úe)Ú_Ú__© r   úI/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/anndata/_io/read.pyr      s    r   ú,Úfloat32)ÚfilenameÚ	delimiterÚfirst_column_namesÚdtypeÚreturnc                 C   s   t | |||ƒS )aé      Read `.csv` file.

    Same as :func:`~anndata.read_text` but with default delimiter `','`.

    Parameters
    ----------
    filename
        Data file.
    delimiter
        Delimiter that separates data within text file.
        If `None`, will split at arbitrary number of white spaces,
        which is different from enforcing splitting at single white space `' '`.
    first_column_names
        Assume the first column stores row names.
    dtype
        Numpy data type.
    )Ú	read_text)r   r   r    r!   r   r   r   Úread_csv   s    r$   )r   Úsheetr!   r"   c                 C   sz   ddl m} |t| ƒ|ƒ}|jdd…dd…f }t|jdd…df j t¡d�}ttj	|j
dd… td�d�}t|||ƒS )zÿ    Read `.xlsx` (Excel) file.

    Assumes that the first columns stores the row names and the first row the
    column names.

    Parameters
    ----------
    filename
        File name to read from.
    sheet
        Name of sheet in Excel file.
    r   )Ú
read_excelNr   )Ú	row_names©r!   )Ú	col_names)Úpandasr&   r   ÚvaluesÚdictZilocÚastypeÚstrÚnpÚarrayÚcolumnsr   )r   r%   r!   r&   ZdfÚXÚrowÚcolr   r   r   r&   9   s     r&   )r   r"   c                 C   sˆ   t j| dddœd�}tj|d |d jj|d jjff|d�}t jt j|d jjdd�d�}t jt j|d jjdd�d�}t	|||d	�S )
zŠ    Read a gzipped condensed count matrix from umi_tools.

    Parameters
    ----------
    filename
        File name to read from.
    Úcategory)ÚgeneÚcellr(   Úcountr7   r6   )Úname)Úindex)r2   ÚobsÚvar)
ÚpdZ
read_tabler   Ú
csr_matrixÚcatÚcodesÚ	DataFrameÚIndexÚ
categoriesr   )r   r!   Útabler2   r;   r<   r   r   r   Úread_umi_toolsS   s    þrE   )r   Úkeyr"   c           	   	   C   s¦   t  | d¡�|}dd„ | ¡ D ƒ}|dkr>td| › d|› d�ƒ‚|| d }i i g}td	d
gƒD ]$\}}||kr^|| d || |< q^W 5 Q R X t||d |d ƒ}|S )zÖ    Read `.h5` (hdf5) file.

    Note: Also looks for fields `row_names` and `col_names`.

    Parameters
    ----------
    filename
        Filename of data file.
    key
        Name of dataset in the file.
    Úrc                 S   s   g | ]}|‘qS r   r   )Ú.0Úkr   r   r   Ú
<listcomp>z   s     zread_hdf.<locals>.<listcomp>Ú z	The file z stores the following sheets:
z&
Call read/read_hdf5 with one of them.r   r'   r)   r   r   )Úh5pyÚFileÚkeysÚ
ValueErrorÚ	enumerater   )	r   rF   ÚfrN   r2   Z	rows_colsÚinamer9   Úadatar   r   r   Úread_hdfj   s    ÿ rT   )ÚinputÚidx_nameÚdimm_mappingr"   c           	         s˜   t  ¡ }i }| ¡ D ]&\}}t ‡ fdd„|D ƒ¡j||< qˆ  ¡ D ]2\}}|jdkrn|jd dkrn|||< qD|||< qD||kr�|j|ddd� ||fS )Nc                    s   g | ]}ˆ   |¡‘qS r   )Úpop)rH   r9   ©rU   r   r   rJ   ‘   s     z(_fmt_loom_axis_attrs.<locals>.<listcomp>r   T)ZdropZinplace)	r=   rA   Úitemsr/   r0   ÚTÚndimÚshapeZ	set_index)	rU   rV   rW   Zaxis_dfZaxis_mappingrF   ÚnamesrI   Úvr   rY   r   Ú_fmt_loom_axis_attrs‹   s     

r`   z0.9)ÚversionTFZsplicedZCellIDZGene)
r   ÚcleanupÚX_nameÚ	obs_namesÚ
obsm_namesÚ	var_namesÚ
varm_namesr!   Úobsm_mappingÚvarm_mapping)r   r   rb   rc   rd   re   rf   rg   r!   rh   ri   r"   c       
      
   K   sP  |dk	r&t dtƒ |	i kr"tdƒ‚|}	|dk	rLt dtƒ |
i krHtdƒ‚|}
t| ƒ} ddlm} || df|Ž��Ö}||j ¡ kr„d	}|rœ|j|  ¡ j	 
¡ n|j| d
 j	}|j|dd�}tƒ }|d	krô|rà|jd	  ¡ j	 
¡ n|jd	 d
 j	|d< |j ¡ D ]:}|d	krþ|�r$|j|  ¡ j	 
¡ n|j| d
 j	||< qþtt|jƒ||	ƒ\}}tt|jƒ||
ƒ\}}i }|�ri }t| ¡ ƒD ]4}tt|| ƒƒdk�r€|| d ||› < ||= �q€|�rÄ||d< i }t| ¡ ƒD ]4}tt|| ƒƒdk�rÔ|| d ||› < ||= �qÔ|�r||d< t|||||�r,|nd|�r8|nd|d�}W 5 Q R X |S )aÜ      Read `.loom`-formatted hdf5 file.

    This reads the whole file into memory.

    Beware that you have to explicitly state when you want to read the file as
    sparse data.

    Parameters
    ----------
    filename
        The filename.
    sparse
        Whether to read the data matrix as sparse.
    cleanup
        Whether to collapse all obs/var fields that only store
        one unique value into `.uns['loom-.']`.
    X_name
        Loompy key with which the data matrix :attr:`~anndata.AnnData.X` is initialized.
    obs_names
        Loompy key where the observation/cell names are stored.
    obsm_mapping
        Loompy keys which will be constructed into observation matrices
    var_names
        Loompy key where the variable/gene names are stored.
    varm_mapping
        Loompy keys which will be constructed into variable matrices
    **kwargs:
        Arguments to loompy.connect

    Example
    -------

    .. code:: python

        pbmc = anndata.read_loom(
            "pbmc.loom",
            sparse=True,
            X_name="lognorm",
            obs_names="cell_names",
            var_names="gene_names",
            obsm_mapping={
                "X_umap": ["umap_1", "umap_2"]
            }
        )
    NzbArgument obsm_names has been deprecated in favour of `obsm_mapping`. In 0.9 this will be an error.zfReceived values for both `obsm_names` and `obsm_mapping`. This is ambiguous, only pass `obsm_mapping`.zbArgument varm_names has been deprecated in favour of `varm_mapping`. In 0.9 this will be an error.zfReceived values for both `varm_names` and `varm_mapping`. This is ambiguous, only pass `varm_mapping`.r   )ÚconnectrG   rK   r   F)ÚcopyÚmatrixr   zloom-obszloom-var)r;   r<   ÚlayersÚobsmÚvarmÚuns)r   ÚFutureWarningrO   r   Zloompyrj   rm   rN   r   r[   Ztocsrr-   r   r`   r,   Z	col_attrsZ	row_attrsÚlistÚlenÚsetr   )r   r   rb   rc   rd   re   rf   rg   r!   rh   ri   Úkwargsrj   Úlcr2   rm   rF   r;   rn   r<   ro   rp   Zuns_obsZuns_varrS   r   r   r   Ú	read_loomŸ   s‚    ?ýÿýÿ(&ÿÿý

ù	rw   )r   r!   r"   c                 C   s:   ddl m} |t| ƒƒ |¡}ddlm} ||ƒ}t|ƒS )z    Read `.mtx` file.

    Parameters
    ----------
    filename
        The filename.
    dtype
        Numpy data type.
    r   )Úmmread©r>   )Zscipy.iorx   r   r-   Zscipy.sparser>   r   )r   r!   rx   r2   r>   r   r   r   Úread_mtx.  s
    rz   c              
   C   sÔ   t | tttfƒst| |||ƒS t| ƒ} | jdkrftjt| ƒdd��}t||||ƒW  5 Q R £ S Q R X nj| jdkr¦t	jt| ƒdd��}t||||ƒW  5 Q R £ S Q R X n*|  ¡ �}t||||ƒW  5 Q R £ S Q R X dS )a      Read `.txt`, `.tab`, `.data` (text) file.

    Same as :func:`~anndata.read_csv` but with default delimiter `None`.

    Parameters
    ----------
    filename
        Data file, filename or stream.
    delimiter
        Delimiter that separates data within text file. If `None`, will split at
        arbitrary number of white spaces, which is different from enforcing
        splitting at single white space `' '`.
    first_column_names
        Assume the first column stores row names.
    dtype
        Numpy data type.
    z.gzÚrt)Úmodez.bz2N)
Ú
isinstancer   r.   ÚbytesÚ
_read_textr   ÚsuffixÚgzipÚopenÚbz2)r   r   r    r!   rQ   r   r   r   r#   C  s    
"
"
r#   )Ú	file_liker"   c                 c   s"   | D ]}|  d¡}|r|V  qdS )z<Helper for iterating only nonempty lines without line breaksz
N)Úrstrip)r„   Úliner   r   r   Ú
iter_linesj  s    
r‡   )rQ   r   r    r!   r"   c                 C   s`  g }g }t | ƒ}g }g }|D ]¼}	|	 d¡rD|	 d¡}
|
rØ| |
¡ q|d k	rd||	krdtd|›d�ƒ‚|	 |¡}t|d ƒs€|}nTt|d ƒr�|rÀd}| |d ¡ | tj|dd … |d	�¡ n| tj||d	�¡  qÚq|�st	|ƒdk�rt |d  ¡ ¡}nt 
t	|d ƒ¡ t¡}tj|td	�}|d k�r6d
}|D ]n}	|	 |¡}|�s\t|d ƒ�sŒd}| |d ¡ | tj|dd … |d	�¡ n| tj||d	�¡  �qª�q:t	|ƒdk�r|d j|d jk�rd}t |d ¡ t¡ t¡}| |d d  t¡ t¡¡ |d dd … g}|D ]V}	|	 |¡}|�r`| |d ¡ | tj|dd … |d	�¡ n| tj||d	�¡ �q |d j|d jk�r°td|d j› d|d j› d�ƒ‚tj||d	�}|�sÚt 
t	|ƒ¡ t¡}n,t |¡}t|ƒD ]\}}| d¡||< �qì|j|jd k�r$|dd … }t|ƒD ]\}}| d¡||< �q,t|t|d�t|d�d�S )Nú#z# zDid not find delimiter z in first line.éÿÿÿÿr   Tr   r(   FzLength of first line (z)) is different from length of last line (z).ú")rd   )rf   )r;   r<   )r‡   Ú
startswithÚlstripÚappendrO   Úsplitr   r/   r0   rs   Zaranger-   r.   ÚsizeÚintrP   Ústripr]   r   r,   )rQ   r   r    r!   ÚcommentsÚdataÚlinesr)   r'   r†   ÚcommentZ	line_listrR   r9   r   r   r   r   r  s„    





$
ÿ
ýr   r2   c                 C   sb   ddl m} |› d�}|| |› d� | |› d� | |› d� f| |› d� d�| |< t| |ƒ | S )	Nr   ry   Z_csrÚ_dataÚ_indicesÚ_indptrÚ_shape)r]   )Zscipy.sparse.csrr>   Údel_sparse_matrix_keys)ÚdrF   r>   Úkey_csrr   r   r   Úload_sparse_csrÝ  s    
&þ

r�   c                 C   s4   | |› d�= | |› d�= | |› d�= | |› d�= d S )Nr–   r—   r˜   r™   r   )Úmappingrœ   r   r   r   rš   é  s    rš   )r   Nr   )r   )N)r   )NNr   )r2   ):Úpathlibr   Úosr   r   Útypesr   Útypingr   r   r   r	   r
   r   r   Úcollectionsr   r�   rƒ   Úwarningsr   rL   Únumpyr/   r*   r=   Zscipyr   rK   r   Úcompatr   Úutilsr   Zh5adr   Zzarrr   ÚImportErrorÚ_er   r.   Úboolr$   r�   r&   rE   rT   rA   Zndarrayr`   rw   rz   r#   r‡   r   r�   rš   r   r   r   r   Ú<module>   s¶      üû ÿ 
 þ"  þôò    üû'	ûk
