U
    ÅmœdH7  ã                   @   sN  d dl mZmZmZmZ d dlmZ d dlZd dlZ	d dl
Zd dlmZmZmZ d dlmZmZ d dlmZ d dlmZ dd	lmZmZmZmZmZmZ d
dlmZ d2dd„Zeeeeeed�dddddddddddœ
ee e ee  eee!  ee  e"ee  e"eej# dœ
dd„ƒZ$eeeeed�ddddddddœee e ee  e"eej# dœdd„ƒZ%eeeeeeed�ddddddddddœ	ee e ee  eee!  ee  e"e"e"ee" eeej#ej#f  d œd!d"„ƒZ&ee	j'ef e!d#œd$d%„Z(d&d'„ Z)d(d)„ Z*ee	j'ef ee! e	j+d*œd+d,„Z,ee	j'ef ee! e	j+d*œd-d.„Z-ej.ddd/�d0d1„ ƒZ/dS )3é    )ÚOptionalÚTupleÚ
CollectionÚUnion)ÚwarnN)ÚissparseÚisspmatrix_csrÚisspmatrix_coo)ÚspmatrixÚ
csr_matrix)Úmean_variance_axis)ÚAnnDataé   )Údoc_expr_repsÚdoc_obs_qc_argsÚdoc_qc_metric_namingÚdoc_obs_qc_returnsÚdoc_var_qc_returnsÚdoc_adata_basicé   )Ú_doc_paramsFc                 C   sJ   |d k	}|r&|r&t d|› d|› d�ƒ‚|r4| j| S |r@| jjS | jS d S )NzECannot use expression from both layer and raw. You provided:'use_raw=z' and 'layer=ú')Ú
ValueErrorZlayersÚrawÚX)ÚadataÚuse_rawÚlayerZis_layer© r   úQ/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scanpy/preprocessing/_qc.pyÚ_choose_mtx_rep   s    ÿ
r    )r   r   r   r   r   ÚcountsZgenesr   )é2   éd   éÈ   iô  T)
Ú	expr_typeÚvar_typeÚqc_varsÚpercent_topr   r   Úlog1pÚinplacer   Úparallel)
r   r%   r&   r'   r(   r   r   r)   r*   Úreturnc       
      	   C   s   |
dk	rt dtƒ |	dkrFt| ||ƒ}	t|	ƒr6t|	ƒ}	t|	ƒrF|	 ¡  tj| j	d�}t|	ƒrz|	j
dd�|d|› d|› �< ntj|	dd�|d|› d|› �< |rÆt |d|› d|› � ¡|d|› d|› �< t |	jdd�¡|d	|› �< |�rt |d	|› � ¡|d
|› �< |�r\t|ƒ}t|	|ƒ}t|ƒD ]4\}}|dd…|f d |d|› d|› d|› �< �q&|D ]¢}t |	dd…| j| jf jdd�¡|d	|› d|› �< |�rÊt |d	|› d|› � ¡|d
|› d|› �< |d	|› d|› � |d	|› �  d |d|› d|› �< �q`|�r|| j|j< n|S dS )a      Describe observations of anndata.

    Calculates a number of qc metrics for observations in AnnData object. See
    section `Returns` for a description of those metrics.

    Note that this method can take a while to compile on the first call. That
    result is then cached to disk to be used later.

    Params
    ------
    {doc_adata_basic}
    {doc_qc_metric_naming}
    {doc_obs_qc_args}
    {doc_expr_reps}
    log1p
        Add `log1p` transformed metrics.
    inplace
        Whether to place calculated metrics in `adata.obs`.
    X
        Matrix to calculate values on. Meant for internal usage.

    Returns
    -------
    QC metrics for observations in adata. If inplace, values are placed into
    the AnnData's `.obs` dataframe.

    {doc_obs_qc_returns}
    Nú?Argument `parallel` is deprecated, and currently has no effect.©Úindexr   ©ZaxisZn_Z_by_Zlog1p_n_Ztotal_Zlog1p_total_r#   Zpct_Z_in_top_Ú_)r   ÚFutureWarningr    r	   r   r   Úeliminate_zerosÚpdÚ	DataFrameZ	obs_namesÚgetnnzÚnpÚcount_nonzeror)   ÚravelÚsumÚsortedÚtop_segment_proportionsÚ	enumerateÚvarÚvaluesZobsÚcolumns)r   r%   r&   r'   r(   r   r   r)   r*   r   r+   Úobs_metricsZproportionsÚiÚnZqc_varr   r   r   Údescribe_obs&   s^    2þÿÿ
ÿÿÿÿþÿrD   )r   r   r   r   )r%   r&   r   r   r*   r)   r   )r   r%   r&   r   r   r,   c                C   s8  |dkr4t | ||ƒ}t|ƒr$t|ƒ}t|ƒr4| ¡  tj| jd�}t|ƒrp|jdd�|d< t	|dd�d |d< n"t
j|dd�|d< |jdd�|d< |r¨t
 |d ¡|d< d|d |jd   d	 |d
< t
 |jdd�¡|d< |ròt
 |d ¡|d< g }	|jD ]}
|	 |
jf tƒ Ž¡ qü|	|_|�r0|| j|j< n|S dS )a9      Describe variables of anndata.

    Calculates a number of qc metrics for variables in AnnData object. See
    section `Returns` for a description of those metrics.

    Params
    ------
    {doc_adata_basic}
    {doc_qc_metric_naming}
    {doc_expr_reps}
    inplace
        Whether to place calculated metrics in `adata.var`.
    X
        Matrix to calculate values on. Meant for internal usage.

    Returns
    -------
    QC metrics for variables in adata. If inplace, values are placed into the
    AnnData's `.var` dataframe.

    {doc_var_qc_returns}
    Nr.   r   r0   zn_cells_by_{expr_type}zmean_{expr_type}zlog1p_mean_{expr_type}r   r#   zpct_dropout_by_{expr_type}ztotal_{expr_type}zlog1p_total_{expr_type})r    r	   r   r   r3   r4   r5   Z	var_namesr6   r   r7   r8   Zmeanr)   Úshaper9   r:   r@   ÚappendÚformatÚlocalsr>   )r   r%   r&   r   r   r*   r)   r   Úvar_metricsZnew_colnamesÚcolr   r   r   Údescribe_varŒ   s>    )ÿþÿ
rK   )r   r   r   r   r   r   )	r%   r&   r'   r(   r   r   r*   r)   r+   )r   r%   r&   r'   r(   r   r   r*   r)   r+   r,   c       	      
   C   sz   |	dk	rt dtƒ t| ||ƒ}
t|
ƒr.t|
ƒ}
t|
ƒr>|
 ¡  t| ||||||
|d�}t| ||||
|d�}|sv||fS dS )aä      Calculate quality control metrics.

    Calculates a number of qc metrics for an AnnData object, see section
    `Returns` for specifics. Largely based on `calculateQCMetrics` from scater
    [McCarthy17]_. Currently is most efficient on a sparse CSR or dense matrix.

    Note that this method can take a while to compile on the first call. That
    result is then cached to disk to be used later.

    Parameters
    ----------
    {doc_adata_basic}
    {doc_qc_metric_naming}
    {doc_obs_qc_args}
    {doc_expr_reps}
    inplace
        Whether to place calculated metrics in `adata`'s `.obs` and `.var`.
    log1p
        Set to `False` to skip computing `log1p` transformed annotations.

    Returns
    -------
    Depending on `inplace` returns calculated metrics
    (as :class:`~pandas.DataFrame`) or updates `adata`'s `obs` and `var`.

    {doc_obs_qc_returns}

    {doc_var_qc_returns}

    Example
    -------
    Calculate qc metrics for visualization.

    .. plot::
        :context: close-figs

        import scanpy as sc
        import seaborn as sns

        pbmc = sc.datasets.pbmc3k()
        pbmc.var["mito"] = pbmc.var_names.str.startswith("MT-")
        sc.pp.calculate_qc_metrics(pbmc, qc_vars=["mito"], inplace=True)
        sns.jointplot(
            data=pbmc.obs,
            x="log1p_total_counts",
            y="log1p_n_genes_by_counts",
            kind="hex",
        )

    .. plot::
        :context: close-figs

        sns.histplot(pbmc.obs["pct_counts_mito"])
    Nr-   )r%   r&   r'   r(   r*   r   r)   )r%   r&   r*   r   r)   )	r   r2   r    r	   r   r   r3   rD   rK   )r   r%   r&   r'   r(   r   r   r*   r)   r+   r   rA   rI   r   r   r   Úcalculate_qc_metricsÚ   s<    Lþø
ú	rL   ©ÚmtxrC   c                 C   s<   t | ƒr.t| ƒst| ƒ} t| j| jt |¡ƒS t| |ƒS dS )a^      Calculates cumulative proportions of top expressed genes

    Parameters
    ----------
    mtx
        Matrix, where each row is a sample, each column a feature.
    n
        Rank to calculate proportions up to. Value is treated as 1-indexed,
        `n=50` will calculate cumulative proportions up to the 50th most
        expressed gene.
    N)	r   r   r   Útop_proportions_sparse_csrÚdataÚindptrr7   ÚarrayÚtop_proportions_denserM   r   r   r   Útop_proportionsI  s
    rT   c                 C   s¬   | j dd�}t tjd|  |d ¡}|d d …d |…f }tj|tjd�}t|jd ƒD ]P}| |||d d …f f }|d d d…  ¡  t 	|¡||  }|||d d …f< qV|S )Nr   r0   ©Údtyper   éÿÿÿÿ)
r:   r7   Úapply_along_axisZargpartitionZ
zeros_likeÚfloat64ÚrangerE   ÚsortÚcumsum)rN   rC   ÚsumsÚpartitionedr?   rB   Úvecr   r   r   rS   _  s    rS   c           	      C   sî   t j|jd |ft jd�}t |jd ¡D ]¾}|| ||d   }}t j|t jd�}|| |kr‚| ||… |d || …< | ¡ }n<t  | ||…  |d ¡d |…  |d d …< | ||…  ¡ }|d d d…  ¡  | 	¡ | ||d d …f< q*|S )Nr   rU   rW   )
r7   ÚzerosÚsizerY   ÚnumbaÚpranger:   Ú	partitionr[   r\   )	rP   rQ   rC   r?   rB   ÚstartÚendr_   Útotalr   r   r   rO   l  s    
,rO   )rN   Únsr,   c                 C   sb   t |ƒ| jd krt|ƒdks&tdƒ‚t| ƒrTt| ƒs>t| ƒ} t| j| j	t
 |¡ƒS t| |ƒS dS )as  
    Calculates total percentage of counts in top ns genes.

    Parameters
    ----------
    mtx
        Matrix, where each row is a sample, each column a feature.
    ns
        Positions to calculate cumulative proportion at. Values are considered
        1-indexed, e.g. `ns=[50]` will calculate cumulative proportion up to
        the 50th most expressed gene.
    r   r   z$Positions outside range of features.N)ÚmaxrE   ÚminÚ
IndexErrorr   r   r   Ú"top_segment_proportions_sparse_csrrP   rQ   r7   rR   Útop_segment_proportions_dense)rN   rh   r   r   r   r<   |  s    r<   c           	      C   sÞ   t  |¡}| jdd�}t  t jd| | jd | ¡d d …d d d…f d d …d |d …f }t  | jd t|ƒf¡}t  | jd ¡}d}t|ƒD ]<\}}||d d …||…f jdd�7 }||d d …|f< |}qŒ||d d …d f  S )Nr   r0   rW   r   )	r7   r[   r:   rX   rd   rE   r`   Úlenr=   )	rN   rh   r]   r^   r?   ÚaccÚprevÚjrC   r   r   r   rm   –  s    
4ÿ rm   )Úcacher+   c                 C   sð  |  tj¡}|  tj¡}t |¡}|d }tj|jd | jd�}tj|jd t|ƒftjd�}tj|jd |f| jd�}t	 
|jd ¡D ]¼}|| ||d   }}	t | ||	… ¡||< |	| |krâ| ||	… ||d |	| …f< n:|	| |k�rt | ||	…  |¡d |…  ||d d …f< t ||d d …f || ¡||d d …f< qˆ|d d …d d d…f d d …d |d …f }tj|jd | jd�}
d}t|jƒD ]B}|
|d d …||| …f jdd�7 }
|
|d d …|f< || }�q”|| |jd df¡ S )NrW   r   rU   r   r0   )Zastyper7   Zint64r[   r`   ra   rV   rn   rY   rb   rc   r:   rd   rZ   Zreshape)rP   rQ   rh   Zmaxidxr]   r?   r^   rB   re   rf   ro   rp   rq   r   r   r   rl   ©  s.    
,**$rl   )FN)0Útypingr   r   r   r   Úwarningsr   rb   Únumpyr7   Zpandasr4   Zscipy.sparser   r   r	   r
   r   Zsklearn.utils.sparsefuncsr   Zanndatar   Z_docsr   r   r   r   r   r   Ú_utilsr   r    ÚstrÚintÚboolr5   rD   rK   rL   rR   rT   rS   rO   Zndarrayr<   rm   Znjitrl   r   r   r   r   Ú<module>   sÐ    
û
ô
ó_ü	÷öHúõ
ôg þ þ