U
    Åmœd	#  ã                   @   s  d dl 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Zd dlmZ ddlmZ ddlmZ d	Zd
ZdZeeeed�ddddœee	ee ef e
eeef  eeejdœdd„ƒZeeeed�dddœeee eeejdœdd„ƒZeeeed�dddddœeeeee eeejdœdd„ƒZeeeed�dddddœeeeeeejdœd d!„ƒZeeed"�d#ei ƒd$œe	ee eeee f f eeeef ejd%œd&d'„ƒƒZ e  !e¡d#d(d)dddei ƒd*œeee
e ee"e
e" e
e" e
e eeef ejd+œ
d,d-„ƒZ#dS ).é    N)Úsingledispatch)ÚMappingProxyType)ÚAnyÚUnionÚOptionalÚIterableÚDictÚMapping)ÚAnnDataé   )Úrank_genes_groups_df)Ú_doc_paramsznorg
    Organism to query. Must be an organism in ensembl biomart. "hsapiens",
    "mmusculus", "drerio", etc.z›host
    A valid BioMart host URL. Alternative values include archive urls (like
    "grch37.ensembl.org") or regional mirrors (like "useast.ensembl.org").z‰use_cache
    Whether pybiomart should use a cache for requests. Will create a
    `.pybiomart.sqlite` file in current directory if used.)Údoc_orgZdoc_hostZdoc_use_cachezwww.ensembl.orgF)ÚfiltersÚhostÚ	use_cache)ÚorgÚattrsr   r   r   Úreturnc          	      C   s    t |tƒr|g}n*t |tjƒr(t|ƒ}ntdt|ƒ› d�ƒ‚zddlm} W n t	k
rh   t	dƒ‚Y nX |||d�}|j
d jd | ¡ }|j||d	d
�}|S )zÈ    A simple interface to biomart.

    Params
    ------
    {doc_org}
    attrs
        What you want returned.
    filters
        What you want to pick out.
    {doc_host}
    {doc_use_cache}
    z'attrs must be of type list or str, was Ú.r   )ÚServerz<This method requires the `pybiomart` module to be installed.)r   ZENSEMBL_MART_ENSEMBLz{}_gene_ensemblT)Ú
attributesr   Zuse_attr_names)Ú
isinstanceÚstrÚcabcr   ÚlistÚ	TypeErrorÚtypeZ	pybiomartr   ÚImportErrorZmartsZdatasetsÚformatÚquery)	r   r   r   r   r   r   ÚserverZdatasetÚres© r#   úP/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scanpy/queries/_queries.pyÚsimple_query    s"    

ÿ

ÿr%   )r   r   )r   r   r   r   r   c                C   s   t | |||d�S )aO      Retrieve gene annotations from ensembl biomart.

    Parameters
    ----------
    {doc_org}
    attrs
        Attributes to query biomart for.
    {doc_host}
    {doc_use_cache}

    Returns
    -------
    Dataframe containing annotations.

    Examples
    --------
    Retrieve genes coordinates and chromosomes

    >>> import scanpy as sc
    >>> annot = sc.queries.biomart_annotations(
            "hsapiens",
            ["ensembl_gene_id", "start_position", "end_position", "chromosome_name"],
        ).set_index("ensembl_gene_id")
    >>> adata.var[annot.columns] = annot
    ©r   r   r   r   ©r%   r&   r#   r#   r$   Úbiomart_annotationsJ   s    "r(   Zexternal_gene_namer#   )Ú	gene_attrÚchr_excluder   r   )r   Ú	gene_namer)   r*   r   r   r   c                C   s0   t | dddg||i||d�}||d  |¡  S )ap      Retrieve gene coordinates for specific organism through BioMart.

    Parameters
    ----------
    {doc_org}
    gene_name
        The gene symbol (e.g. "hgnc_symbol" for human) for which to retrieve
        coordinates.
    gene_attr
        The biomart attribute the gene symbol should show up for.
    chr_exclude
        A list of chromosomes to exclude from query.
    {doc_host}
    {doc_use_cache}

    Returns
    -------
    Dataframe containing gene coordinates for the specified gene symbol.

    Examples
    --------
    >>> import scanpy as sc
    >>> sc.queries.gene_coordinates("hsapiens", "MT-TF")
    Úchromosome_nameZstart_positionZend_position)r   r   r   r   r   )r%   Úisin)r   r+   r)   r*   r   r   r"   r#   r#   r$   Úgene_coordinateso   s    #ûr.   ZMT)Úattrnamer   r   Ú
chromosome)r   r/   r   r   r0   r   c                C   s   t | |gd|gi||d�S )aP      Mitochondrial gene symbols for specific organism through BioMart.

    Parameters
    ----------
    {doc_org}
    attrname
        Biomart attribute field to return. Possible values include
        "external_gene_name", "ensembl_gene_id", "hgnc_symbol", "mgi_symbol",
        and "zfin_id_symbol".
    {doc_host}
    {doc_use_cache}
    chromosome
        Mitochrondrial chromosome name used in BioMart for organism.

    Returns
    -------
    Dataframe containing identifiers for mitochondrial genes.

    Examples
    --------
    >>> import scanpy as sc
    >>> mito_gene_names = sc.queries.mitochondrial_genes("hsapiens")
    >>> mito_ensembl_ids = sc.queries.mitochondrial_genes("hsapiens", attrname="ensembl_gene_id")
    >>> mito_gene_names_fly = sc.queries.mitochondrial_genes("dmelanogaster", chromosome="mitochondrion_genome")
    r,   )r   r   r   r   r'   )r   r/   r   r   r0   r#   r#   r$   Úmitochondrial_genesœ   s    #ûr1   )r   Zhsapiens©r   Úgprofiler_kwargs)Ú	containerr   r3   r   c                C   s€   zddl m} W n tk
r,   tdƒ‚Y nX |ddd�}t|ƒ}dD ]"}| |¡dk	rFtd	|› d
�ƒ‚qF|j| fd|i|—ŽS )aa      Get enrichment for DE results.

    This is a thin convenience wrapper around the very useful gprofiler_.

    This method dispatches on the first argument, leading to the following two
    signatures::

        enrich(container, ...)
        enrich(adata: AnnData, group, key: str, ...)

    Where::

        enrich(adata, group, key, ...) = enrich(adata.uns[key]["names"][group], ...)

    .. _gprofiler: https://pypi.org/project/gprofiler-official/#description

    Parameters
    ----------
    container
        Contains list of genes you'd like to search. If container is a `dict` all
        enrichment queries are made at once.
    adata
        AnnData object whose group will be looked for.
    group
        The group whose genes should be used for enrichment.
    key
        Key in `uns` to find group under.
    {doc_org}
    gprofiler_kwargs
        Keyword arguments to pass to `GProfiler.profile`, see gprofiler_. Some
        useful options are `no_evidences=False` which reports gene intersections,
        `sources=['GO:BP']` which limits gene sets to only GO biological processes and
        `all_results=True` which returns all results including the non-significant ones.
    **kwargs
        All other keyword arguments are passed to `sc.get.rank_genes_groups_df`. E.g.
        pval_cutoff, log2fc_min.

    Returns
    -------
    Dataframe of enrichment results.

    Examples
    --------
    Using `sc.queries.enrich` on a list of genes:

    >>> import scanpy as sc
    >>> sc.queries.enrich(['KLF4', 'PAX5', 'SOX2', 'NANOG'], org="hsapiens")
    >>> sc.queries.enrich({{'set1':['KLF4', 'PAX5'], 'set2':['SOX2', 'NANOG']}}, org="hsapiens")

    Using `sc.queries.enrich` on an :class:`anndata.AnnData` object:

    >>> pbmcs = sc.datasets.pbmc68k_reduced()
    >>> sc.tl.rank_genes_groups(pbmcs, "bulk_labels")
    >>> sc.queries.enrich(pbmcs, "CD34+")
    r   )Ú	GProfilerzEThis method requires the `gprofiler-official` module to be installed.ZscanpyT)Ú
user_agentZreturn_dataframe)ÚorganismNz
Argument `zL` should be passed directly through `enrich`, not through `gprofiler_kwargs`r7   )Ú	gprofilerr5   r   ÚdictÚgetÚ
ValueErrorZprofile)r4   r   r3   r5   r8   Úkr#   r#   r$   ÚenrichÈ   s    @ÿ

ÿr=   Zrank_genes_groupsgš™™™™™©?)r   ÚkeyÚpval_cutoffÚ
log2fc_minÚ
log2fc_maxÚgene_symbolsr3   )
ÚadataÚgroupr   r>   r?   r@   rA   rB   r3   r   c             	   C   sN   t | ||||||d�}	|d k	r0t|	|  ¡ ƒ}
nt|	d  ¡ ƒ}
t|
||d�S )N)rD   r>   r?   r@   rA   rB   Únamesr2   )r   r   Zdropnar=   )rC   rD   r   r>   r?   r@   rA   rB   r3   ÚdeZ	gene_listr#   r#   r$   Ú_enrich_anndata  s    ù	rG   )$Úcollections.abcÚabcr   Ú	functoolsr   Útypesr   Útypingr   r   r   r   r   r	   ZpandasÚpdZanndatar
   r:   r   Ú_utilsr   Z_doc_orgZ	_doc_hostZ_doc_use_cacher   ÚboolZ	DataFramer%   r(   r.   r1   r=   ÚregisterÚfloatrG   r#   r#   r#   r$   Ú<module>   s²    úù)ûú$ùø,úù+ü
ûOö
õ