U
    md                  	   @   s   d dl mZ d dlmZmZmZ d dlZd dl	Z
d dlmZ ddlmZ deeeeee eeef d
ddZedddZdS )    N)Iterable
CollectionUnion)AnnData   )loggingT         r      )adata
start_cellbranchk
componentsnum_waypointsc                 C   sF  zddl m} W n tk
r,   tdY nX t| j|kd }t|dkr^td| dt|t	j
rt|| jj}|jdkrtd | }n|| jd krtd|d }t|}|| jd d	d	|f |||||d
}	|	d }
|
t|
 t|
t|
  }
t|
| jd< |rB|	d t}t|| jd< d	S )a	      Wishbone identifies bifurcating developmental trajectories from single-cell data
    [Setty16]_.

    Wishbone is an algorithm for positioning single cells along bifurcating
    developmental trajectories with high resolution. Wishbone uses multi-dimensional
    single-cell data, such as mass cytometry or RNA-Seq data, as input and orders cells
    according to their developmental progression, and it pinpoints bifurcation points
    by labeling each cell as pre-bifurcation or as one of two post-bifurcation cell
    fates.

    .. note::
       More information and bug reports `here
       <https://github.com/dpeerlab/wishbone>`__.

    Parameters
    ----------
    adata
        Annotated data matrix.
    start_cell
        Desired start cell from `obs_names`.
    branch
        Use True for Wishbone and False for Wanderlust.
    k
        Number of nearest neighbors for graph construction.
    components
        Components to use for running Wishbone.
    num_waypoints
        Number of waypoints to sample.

    Returns
    -------
    Updates `adata` with the following fields:

    `trajectory_wishbone` : (`adata.obs`, dtype `float64`)
        Computed trajectory positions.
    `branch_wishbone` : (`adata.obs`, dtype `int64`)
        Assigned branches.

    Example
    -------

    >>> import scanpy.external as sce
    >>> import scanpy as sc

    **Loading Data and Pre-processing**

    >>> adata = sc.datasets.pbmc3k()
    >>> sc.pp.normalize_per_cell(adata)
    >>> sc.pp.pca(adata)
    >>> sc.tl.tsne(adata=adata, n_pcs=5, perplexity=30)
    >>> sc.pp.neighbors(adata, n_pcs=15, n_neighbors=10)
    >>> sc.tl.diffmap(adata, n_comps=10)

    **Running Wishbone Core Function**

    Usually, the start cell for a dataset should be chosen based on high expression of
    the gene of interest:

    >>> sce.tl.wishbone(
    ...     adata=adata, start_cell='ACAAGAGACTTATC-1',
    ...     components=[2, 3], num_waypoints=150,
    ... )

    **Visualizing Wishbone results**

    >>> sc.pl.tsne(adata, color=['trajectory_wishbone', 'branch_wishbone'])
    >>> markers = ['C1QA', 'PSAP', 'CD79A', 'CD79B', 'CST3', 'LYZ', 'MALAT1']
    >>> sce.pl.wishbone_marker_trajectory(adata, markers, show=True)

    For further demonstration of Wishbone methods and visualization please follow the
    notebooks in the package `Wishbone_for_single_cell_RNAseq.ipynb
    <https://github.com/dpeerlab/wishbone/tree/master/notebooks>`_.    r   )wishbonez@
please install wishbone:

	https://github.com/dpeerlab/wishbonezStart cell z9 not found in data. Please rerun with correct start cell.zJSome of the specified waypoints are not in the data. These will be removedzinum_waypoints parameter is higher than the number of cells in the dataset. Please select a smaller number	X_diffmapN)sr   lr   r   Z
Trajectorytrajectory_wishboneZBranchesbranch_wishbone)Zwishbone.corer   ImportErrornpwhere	obs_nameslenRuntimeError
isinstancecabcr   Z	setdiff1dobsindexsizer   warningtolistshapelistobsmminmaxZasarrayZastypeint)r   r   r   r   r   r   Z
c_wishboner   diffres
trajectoryZbranches r/   U/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scanpy/external/tl/_wishbone.pyr      sP    R




r   )r   c                 C   sX   ddl m}m} ||  }tj| jd | jd|_||}| j	d |_
| j	d |_|S )Nr   )SCDataWishboner   )r"   r   r   )Zwishbone.wbr1   r2   Zto_dfpdZ	DataFramer(   r   Zdiffusion_eigenvectorsr!   r.   r   )r   r1   r2   Zscdatawbr/   r/   r0   _anndata_to_wishbone   s     r5   )Tr   r	   r   )collections.abcabcr    typingr   r   r   numpyr   Zpandasr3   Zanndatar    r   strboolr+   r   r5   r/   r/   r/   r0   <module>   s&       
 