{ "cells": [ { "cell_type": "markdown", "id": "3f3b0d2a-9501-4393-a560-7f5512da9ecd", "metadata": {}, "source": [ "# Tutorials_paired_modality" ] }, { "cell_type": "code", "execution_count": 1, "id": "2346a090-836f-46fc-9567-bb9d3e0b1cb5", "metadata": {}, "outputs": [], "source": [ "\n", "import scanpy as sc\n", "import torch\n", "import os\n", "import pandas as pd\n", "os.chdir(\"/public/home/off_liukunpeng/project/11_cluster_problem/AgaeSMO\")\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "319f1413-52f9-4382-94b9-afecf41c7283", "metadata": {}, "outputs": [], "source": [ "import sys\n", "sys.path.append(\"/public/home/off_liukunpeng/project/11_cluster_problem/AgaeSMO\")" ] }, { "cell_type": "code", "execution_count": 3, "id": "96bc551b-60f3-4e22-b50a-5c02c6d20eba", "metadata": {}, "outputs": [], "source": [ "import community as louvain\n", "import AgaeSMO as AgaeSMO_v1" ] }, { "cell_type": "code", "execution_count": 4, "id": "ee335c7f-de50-498e-b08c-c9c948385930", "metadata": {}, "outputs": [], "source": [ "device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')\n" ] }, { "cell_type": "code", "execution_count": 5, "id": "215a05bf-d989-415f-bfc5-3b283aa96077", "metadata": {}, "outputs": [], "source": [ "os.environ['R_HOME'] = '/public/home/off_liukunpeng/software/anaconda3/envs/pyg1/lib/R' \n" ] }, { "cell_type": "code", "execution_count": 6, "id": "3db734c9-d1e3-4a1f-90c6-4717d958af64", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/public/home/off_liukunpeng/software/anaconda3/envs/pyg1/lib/python3.9/site-packages/anndata/_core/anndata.py:1820: UserWarning: Variable names are not unique. To make them unique, call `.var_names_make_unique`.\n", " utils.warn_names_duplicates(\"var\")\n", "/public/home/off_liukunpeng/software/anaconda3/envs/pyg1/lib/python3.9/site-packages/anndata/_core/anndata.py:1820: UserWarning: Variable names are not unique. To make them unique, call `.var_names_make_unique`.\n", " utils.warn_names_duplicates(\"var\")\n" ] } ], "source": [ "\n", "adata_omics1 = sc.read_h5ad(\"data/Human_Lymph_Node_A1/adata_RNA.h5ad\")\n", "adata_omics2 = sc.read_h5ad(\"data/Human_Lymph_Node_A1/adata_ADT.h5ad\")\n", "\n", "adata_omics1.var_names_make_unique()\n", "adata_omics2.var_names_make_unique()" ] }, { "cell_type": "code", "execution_count": 7, "id": "f6578152-a05a-4348-8daf-9e1717c35aaa", "metadata": {}, "outputs": [], "source": [ "sc.pp.filter_genes(adata_omics1, min_cells=10)\n", "sc.pp.highly_variable_genes(adata_omics1, flavor=\"seurat_v3\", n_top_genes=3000)\n", "sc.pp.normalize_total(adata_omics1, target_sum=1e4)\n", "sc.pp.log1p(adata_omics1)\n", "sc.pp.scale(adata_omics1)" ] }, { "cell_type": "code", "execution_count": 8, "id": "eb84df43-800f-45df-8a16-91e9989de765", "metadata": {}, "outputs": [], "source": [ "adata_omics1_high = adata_omics1[:, adata_omics1.var['highly_variable']]\n", "adata_omics1.obsm['feat'] = AgaeSMO_v1.pca(adata_omics1_high, n_comps=adata_omics2.n_vars-1)\n", "adata_omics1.obsm['tensor']=adata_omics1[:, adata_omics1.var['highly_variable']].X\n", "# adata_omics1.obsm['tensor']=AgaeSMO_v1.pca(adata_omics1_high, n_comps=100)\n", "\n", "adata_omics2 = AgaeSMO_v1.clr_normalize_each_cell(adata_omics2)\n", "sc.pp.scale(adata_omics2)\n", "adata_omics2.obsm['feat'] = AgaeSMO_v1.pca(adata_omics2, n_comps=adata_omics2.n_vars-1)\n", "# adata_omics2.obsm['tensor']=AgaeSMO_v1.pca(adata_omics2, n_comps=adata_omics2.n_vars-1)\n", "adata_omics2.obsm['tensor']=adata_omics2.X\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "6fef8202-6baf-4e69-8b2d-64d46ad5317e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "------Calculating spatial graph...\n", "The graph contains 20902 edges, 3484 cells.\n", "5.9994 neighbors per cell on average.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/public/home/off_liukunpeng/project/11_cluster_problem/AgaeSMO/AgaeSMO/utils.py:529: FutureWarning: pandas.value_counts is deprecated and will be removed in a future version. Use pd.Series(obj).value_counts() instead.\n", " plot_df = pd.value_counts(pd.value_counts(adata.uns['adj_spatial_']['Cell1']))\n", "/public/home/off_liukunpeng/project/11_cluster_problem/AgaeSMO/AgaeSMO/utils.py:529: FutureWarning: pandas.value_counts is deprecated and will be removed in a future version. Use pd.Series(obj).value_counts() instead.\n", " plot_df = pd.value_counts(pd.value_counts(adata.uns['adj_spatial_']['Cell1']))\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "------Calculating spatial graph...\n", "The graph contains 20902 edges, 3484 cells.\n", "5.9994 neighbors per cell on average.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/public/home/off_liukunpeng/project/11_cluster_problem/AgaeSMO/AgaeSMO/utils.py:529: FutureWarning: pandas.value_counts is deprecated and will be removed in a future version. Use pd.Series(obj).value_counts() instead.\n", " plot_df = pd.value_counts(pd.value_counts(adata.uns['adj_spatial_']['Cell1']))\n", "/public/home/off_liukunpeng/project/11_cluster_problem/AgaeSMO/AgaeSMO/utils.py:529: FutureWarning: pandas.value_counts is deprecated and will be removed in a future version. Use pd.Series(obj).value_counts() instead.\n", " plot_df = pd.value_counts(pd.value_counts(adata.uns['adj_spatial_']['Cell1']))\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "data = AgaeSMO_v1.construct_neighbor_graph(adata_omics1, adata_omics2,6,6,k=6)\n" ] }, { "cell_type": "code", "execution_count": 10, "id": "ac072990-a672-4020-a4fe-a3ec85e87892", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "torch.Size([3484, 3000]) torch.Size([3484, 31])\n", "dim_input1 3000 dim_input2 31 \n", " dim_output1 30 dim_output2 30\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 0%| | 0/600 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "n_cluster=6\n", "tool = 'mclust' # mclust, leiden, and louvain  \n", "AgaeSMO_v1.clustering(adata,refine_=False, key='AgaeSMO', add_key='AgaeSMO', n_clusters=n_cluster, method=tool, use_pca=True)# visualization\n", "\n", "\n", "annotation=pd.read_csv('data/Human_Lymph_Node_A1/annotation.csv')\n", "\n", "adata.obs['Ground Truth']=annotation.loc[:,'manual-anno'].to_list()\n", "indexs=AgaeSMO_v1.supervise_index(adata,\"AgaeSMO\",'Ground Truth')\n", "print(indexs)\n", "\n", "ARI=indexs[\"ARI\"]\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "fig, ax_list = plt.subplots(1, 2, figsize=(12, 4))\n", "sc.pp.neighbors(adata, use_rep='AgaeSMO', n_neighbors=10)\n", "sc.tl.umap(adata)\n", "\n", "sc.pl.umap(adata, color='AgaeSMO', ax=ax_list[0], title='AgaeSMO', s=30, show=False)\n", "sc.pl.embedding(adata, basis='spatial', color='AgaeSMO', ax=ax_list[1], title=f'AgaeSMO:{ARI}', s=50, show=False)\n", "\n", "plt.tight_layout(w_pad=0.3)\n", "# plt.show()\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "edfb1cd0-2d23-45b9-96ba-3072f27d922c", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "pyg1", "language": "python", "name": "pyg1" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.19" } }, "nbformat": 4, "nbformat_minor": 5 }