U
    Åmœd½  ã                   @   sú   d dl mZ d dlmZ d dlm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 e
je
jdœdd„Zedœdd„Zeedœdd„ƒZeejdœdd„Zeejdœdd„Z ddœee!ejdœdd„Z"dS ) é    )Úurlopen)Ú	HTTPError)ÚZipFile)ÚBinaryION)Úsparseé   )Ú	_download)Úsettings)Úloggingé   )Úcheck_datasetdir_exists)Ú	dataframeÚreturnc                 C   s6   |   dd„ ¡}|dk|t| ƒkB }| jd d …| f S )Nc                 S   s   t |  ¡ ƒS ©N)ÚlenÚunique)Úx© r   ú^/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scanpy/datasets/_ebi_expression_atlas.pyÚ<lambda>   ó    z _filter_boring.<locals>.<lambda>r   )Úapplyr   Úloc)r   Zunique_valsZ	is_boringr   r   r   Ú_filter_boring   s    r   )Ú	accessionc              
   C   sb   d| › d�}zt |ƒ� W 5 Q R X W n8 tk
r\ } z|j› d|› d�|_‚ W 5 d }~X Y nX d S )Nz)https://www.ebi.ac.uk/gxa/sc/experiments/ú/z (ú))r   r   Úmsg)r   Úbase_urlÚer   r   r   Ú	sniff_url   s    
r    c                 C   sf   t | ƒ d| › �}|› d�}|› d�}tj|  }|jddd� t|d |d ƒ t|d |d	 ƒ d S )
Nz(https://www.ebi.ac.uk/gxa/sc/experiment/z/download?accessKey=&fileType=z"/download/zip?accessKey=&fileType=T)ÚparentsÚexist_okzexperiment-designúexperimental_design.tsvzquantification-rawúexpression_archive.zip)r    r	   Ú
datasetdirÚmkdirr   )r   r   Z
design_urlZmtx_urlÚexperiment_dirr   r   r   Údownload_experiment"   s    



þþr(   )Ústreamr   c           	      C   s¸   |   ¡ }| d¡r|   ¡ }qdd„ |d d…  d¡D ƒ\}}}t tj¡j}||ks\||krdtj}ntj}tj	| dd ||tj
dœd�}tj|d	 |d
 d
 |d d
 ff||fd�}|S )Nó   %c                 s   s   | ]}t |ƒV  qd S r   )Úint)Ú.0r   r   r   r   Ú	<genexpr>;   s     z'read_mtx_from_stream.<locals>.<genexpr>éÿÿÿÿó    z\s+)r   r   r   )ÚsepÚheaderZdtyper   r   r   )Úshape)ÚreadlineÚ
startswithÚsplitÚnpZiinfoZint32ÚmaxZint64ÚpdÚread_csvZfloat32r   Ú
csr_matrix)	r)   ZcurlineÚnÚmÚ_Z	max_int32Zcoord_dtypeÚdataZmtxr   r   r   Úread_mtx_from_stream7   s     

"ü.r?   )Úarchiver   c           
   	   C   sê   |   ¡ }t|ƒdkst‚tdd„ |D ƒƒ}tdd„ |D ƒƒ}tdd„ |D ƒƒ}|  |d¡�}t|ƒ}W 5 Q R X |  |d¡�}tj|dd d�d	 }W 5 Q R X |  |d¡�$}tj|dd d�jd d …d
f }W 5 Q R X t	 
|¡}	||	_||	_|	S )Né   c                 s   s   | ]}|j  d ¡r|V  qdS )z.mtxN©ÚfilenameÚendswith©r,   Úir   r   r   r-   P   s      z/read_expression_from_archive.<locals>.<genexpr>c                 s   s   | ]}|j  d ¡r|V  qdS )z	.mtx_rowsNrB   rE   r   r   r   r-   Q   s      c                 s   s   | ]}|j  d ¡r|V  qdS )z	.mtx_colsNrB   rE   r   r   r   r-   R   s      Úrú	)r0   r1   r   r   )Úinfolistr   ÚAssertionErrorÚnextÚopenr?   r8   r9   ZilocÚanndataÚAnnDataZ	var_namesZ	obs_names)
r@   ÚinfoZmtx_data_infoZmtx_rows_infoZmtx_cols_infoÚfÚexprÚvarnameZobsnameÚadatar   r   r   Úread_expression_from_archiveM   s    (
rT   F)Úfilter_boring)r   rU   r   c             	   C   sÔ   t j|  }|| › d� }z t |¡}|r4t|jƒ|_|W S  tk
rL   Y nX t| ƒ t 	d| › d| 
¡ › �¡ t|d dƒ�}t|ƒ}W 5 Q R X tj|d ddd	�}||j|j< |j|d
d� |rÐt|jƒ|_|S )a      Load a dataset from the `EBI Single Cell Expression Atlas
    <https://www.ebi.ac.uk/gxa/sc/experiments>`__

    Downloaded datasets are saved in the directory specified by
    :attr:`~scanpy._settings.ScanpyConfig.datasetdir`.

    Params
    ------
    accession
        Dataset accession. Like ``E-GEOD-98816`` or ``E-MTAB-4888``.
        This can be found in the url on the datasets page, for example
        https://www.ebi.ac.uk/gxa/sc/experiments/E-GEOD-98816/results/tsne.
    filter_boring
        Whether boring labels in `.obs` should be automatically removed, such as
        labels with a single or :attr:`~anndata.AnnData.n_obs` distinct values.

    Example
    -------
    >>> import scanpy as sc
    >>> adata = sc.datasets.ebi_expression_atlas("E-MTAB-4888")
    z.h5adzDownloaded z to r$   rG   r#   rH   r   )r0   Z	index_colÚgzip)Úcompression)r	   r%   rM   Úreadr   ÚobsÚOSErrorr(   ÚloggrO   Úabsoluter   rT   r8   r9   ÚcolumnsÚwrite)r   rU   r'   Zdataset_pathrS   rP   rY   r   r   r   Úebi_expression_atlas`   s&    

r_   )#Úurllib.requestr   Úurllib.errorr   Úzipfiler   Útypingr   rM   Zpandasr8   Únumpyr6   Zscipyr   Z	readwriter   Z	_settingsr	   Ú r
   r[   Ú_utilsr   Z	DataFramer   Ústrr    r(   r:   r?   rN   rT   Úboolr_   r   r   r   r   Ú<module>   s.   ÿ þ