|
import gradio as gr |
|
import pandas as pd |
|
import umap |
|
import matplotlib.pyplot as plt |
|
import os |
|
import tempfile |
|
import scanpy as sc |
|
import argparse |
|
import subprocess |
|
import sys |
|
from io import BytesIO |
|
from huggingface_hub import hf_hub_download |
|
|
|
|
|
def main(input_file_path, species): |
|
|
|
|
|
current_working_directory = os.getcwd() |
|
|
|
|
|
print("Current Working Directory:", current_working_directory) |
|
|
|
|
|
os.system('git clone https://github.com/minwoosun/UCE.git') |
|
os.chdir('/home/user/app/UCE') |
|
|
|
|
|
current_working_directory = os.getcwd() |
|
|
|
|
|
print("Current Working Directory:", current_working_directory) |
|
|
|
|
|
new_directory = "/home/user/app/UCE" |
|
|
|
|
|
sys.path.append(new_directory) |
|
|
|
|
|
|
|
|
|
|
|
from evaluate import AnndataProcessor |
|
from accelerate import Accelerator |
|
|
|
|
|
|
|
|
|
|
|
|
|
dir_path = '/home/user/app/UCE/' |
|
model_loc = 'minwoosun/uce-100m' |
|
|
|
print(input_file_path) |
|
print(dir_path) |
|
print(model_loc) |
|
|
|
|
|
if input_file_path is None or not os.path.exists(input_file_path): |
|
raise ValueError(f"Invalid adata_path: {input_file_path}. Please check if the file exists.") |
|
|
|
|
|
command = [ |
|
'python', |
|
'/home/user/app/UCE/eval_single_anndata.py', |
|
'--adata_path', input_file_path, |
|
'--dir', dir_path, |
|
'--model_loc', model_loc |
|
] |
|
|
|
|
|
print("Running command:", command) |
|
|
|
print("---> RUNNING UCE") |
|
result = subprocess.run(command, capture_output=True, text=True, check=True) |
|
print(result.stdout) |
|
print(result.stderr) |
|
print("---> FINSIH UCE") |
|
|
|
|
|
|
|
|
|
UMAP = True |
|
|
|
if (UMAP): |
|
|
|
|
|
file_name_with_ext = os.path.basename(input_file_path) |
|
file_name = os.path.splitext(file_name_with_ext)[0] |
|
output_file = "/home/user/app/UCE/" + f"{file_name}_uce_adata.h5ad" |
|
|
|
adata = sc.read_h5ad(output_file) |
|
|
|
labels = pd.Categorical(adata.obs["cell_type"]) |
|
|
|
reducer = umap.UMAP(n_neighbors=15, min_dist=0.1, n_components=2, random_state=42) |
|
embedding = reducer.fit_transform(adata.obsm["X_uce"]) |
|
|
|
plt.figure(figsize=(10, 8)) |
|
|
|
|
|
scatter = plt.scatter(embedding[:, 0], embedding[:, 1], c=labels.codes, cmap='Set1', s=50, alpha=0.6) |
|
|
|
|
|
handles = [] |
|
for i, cell_type in enumerate(labels.categories): |
|
handles.append(plt.Line2D([0], [0], marker='o', color='w', label=cell_type, |
|
markerfacecolor=plt.cm.Set1(i / len(labels.categories)), markersize=10)) |
|
|
|
plt.legend(handles=handles, title='Cell Type') |
|
plt.title('UMAP projection of the data') |
|
plt.xlabel('UMAP1') |
|
plt.ylabel('UMAP2') |
|
|
|
|
|
buf = BytesIO() |
|
plt.savefig(buf, format='png') |
|
buf.seek(0) |
|
|
|
|
|
img = plt.imread(buf, format='png') |
|
else: |
|
img = None |
|
print("no image") |
|
|
|
return img, output_file |
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
|
|
css = """ |
|
body {background-color: black; color: white;} |
|
.gradio-container {background-color: black; color: white;} |
|
input, button, select, textarea {background-color: #333; color: white;} |
|
""" |
|
|
|
with gr.Blocks(css=css) as demo: |
|
gr.Markdown( |
|
''' |
|
<div style="text-align:center; margin-bottom:20px; color: white;"> |
|
<span style="font-size:3em; font-weight:bold;">UCE 100M Demo</span> |
|
</div> |
|
<div style="text-align:center; margin-bottom:10px; color: white;"> |
|
<span style="font-size:1.5em; font-weight:bold;">Universal Cell Embeddings: Explore Single Cell Data</span> |
|
</div> |
|
<div style="text-align:center; margin-bottom:20px;"> |
|
<a href="https://github.com/minwoosun/UCE"> |
|
<img src="https://badges.aleen42.com/src/github.svg" alt="GitHub" style="display:inline-block; margin-right:10px;"> |
|
</a> |
|
<a href="https://arxiv.org/abs/2408.03322"> |
|
<img src="https://img.shields.io/badge/arXiv-2408.03322-green?style=plastic" alt="Paper" style="display:inline-block; margin-right:10px;"> |
|
</a> |
|
</div> |
|
<div style="text-align:left; margin-bottom:20px; color: white;"> |
|
Upload a `.h5ad` single cell gene expression file and select the species (Human/Mouse). |
|
The demo will generate UMAP projections of the embeddings and allow you to download the embeddings for further analysis. |
|
</div> |
|
<div style="margin-bottom:20px; color: white;"> |
|
<ol style="list-style:none; padding-left:0;"> |
|
<li>1. Upload your `.h5ad` file</li> |
|
<li>2. Select the species</li> |
|
<li>3. View the UMAP scatter plot</li> |
|
<li>4. Download the UMAP coordinates</li> |
|
</ol> |
|
</div> |
|
<div style="text-align:left; line-height:1.8; color: white;"> |
|
Please consider citing the following paper if you use this tool in your research: |
|
</div> |
|
<div style="text-align:left; line-height:1.8; color: white;"> |
|
Sun, M., et al. Universal Cell Embeddings: A tool for single-cell analysis. arXiv:2408.03322 (2024) |
|
</div> |
|
''' |
|
) |
|
|
|
|
|
file_input = gr.File(label="Upload a .h5ad single cell gene expression file") |
|
species_input = gr.Dropdown(choices=["human", "mouse"], label="Select species") |
|
image_output = gr.Image(type="numpy", label="UMAP of UCE Embeddings") |
|
file_output = gr.File(label="Download embeddings") |
|
|
|
|
|
gr.Button("Run").click( |
|
fn=main, |
|
inputs=[file_input, species_input], |
|
outputs=[image_output, file_output] |
|
) |
|
|
|
demo.launch() |