{ "cells": [ { "cell_type": "markdown", "id": "eb347af3-95cc-478d-8033-5b10a9fe4061", "metadata": {}, "source": [ "# Tutorials_ST_SM" ] }, { "cell_type": "code", "execution_count": 1, "id": "e85cd518-f68d-420d-be83-b7e4992425b3", "metadata": {}, "outputs": [], "source": [ "import scanpy as sc\n", "import torch\n", "import os\n", "import pandas as pd\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "e1bd3f28-7418-4806-8a95-e8289c5f6c71", "metadata": {}, "outputs": [], "source": [ "import community as louvain\n", "import AgaeSMO as AgaeSMO_v1" ] }, { "cell_type": "code", "execution_count": 3, "id": "8a691823-92de-496f-9863-cb1b8911b509", "metadata": {}, "outputs": [], "source": [ "random_seed = 2022\n", "AgaeSMO_v1.fix_seed(random_seed)\n", "# In[4]:\n", "\n", "\n", "device = torch.device('cuda:2' if torch.cuda.is_available() else 'cpu')\n", "\n", "# the location of R, which is required for the 'mclust' algorithm. Please replace the path below with local R installation path\n", "os.environ['R_HOME'] = '/public/home/off_liukunpeng/software/anaconda3/envs/pyg1/lib/R' \n" ] }, { "cell_type": "markdown", "id": "f9742c6c", "metadata": {}, "source": [ "data of demo deposited in https://drive.google.com/drive/folders/1eK5zSKmSV2eaQ9jhIEcKPXwuiWaGfldH?usp=sharing" ] }, { "cell_type": "code", "execution_count": 4, "id": "fb66e182-bce0-4d1a-8fcc-a4fa3b70cd28", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AnnData object with n_obs × n_vars = 2675 × 32285\n", " obs: 'in_tissue', 'array_row', 'array_col'\n", " var: 'gene_ids', 'feature_types', 'genome'\n", " uns: 'spatial'\n", " obsm: 'spatial'\n", "AnnData object with n_obs × n_vars = 2438 × 1538\n", " obs: 'array_row', 'array_col'\n", " uns: 'spatial'\n", " obsm: 'spatial'\n" ] }, { "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" ] } ], "source": [ "\n", "adata_omics1 = sc.read_h5ad(\"data/SMA/st.h5ad\")\n", "adata_omics2 = sc.read_h5ad(\"data/SMA/ms.h5ad\")\n", "\n", "adata_omics1.var_names_make_unique()\n", "adata_omics2.var_names_make_unique()\n", "\n", "print(adata_omics1)\n", "print(adata_omics2)" ] }, { "cell_type": "code", "execution_count": 5, "id": "a2526711-0d83-49df-853f-7459cb90b4e6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "st_keys=list(adata_omics1.uns[\"spatial\"].keys())[0]\n", "adata_omics1.obsm[\"HE_domain_coor\"]=adata_omics1.obsm[\"spatial\"]*adata_omics1.uns[\"spatial\"][st_keys][\"scalefactors\"][\"tissue_hires_scalef\"]\n", "adata_omics2.obsm[\"HE_domain_coor\"]=adata_omics2.obsm[\"spatial\"]\n", "import matplotlib.pyplot as plt\n", "plt.scatter(adata_omics1.obsm[\"HE_domain_coor\"][:,0],adata_omics1.obsm[\"HE_domain_coor\"][:,1],s=1,c=\"red\")\n", "plt.scatter(adata_omics2.obsm[\"HE_domain_coor\"][:,0],adata_omics2.obsm[\"HE_domain_coor\"][:,1],s=1,c=\"blue\")\n", "\n" ] }, { "cell_type": "code", "execution_count": 6, "id": "56f9f266-2893-4abf-a701-a472da611c4a", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/public/home/off_liukunpeng/software/anaconda3/envs/pyg1/lib/python3.9/site-packages/scanpy/preprocessing/_highly_variable_genes.py:64: UserWarning: `flavor='seurat_v3'` expects raw count data, but non-integers were found.\n", " warnings.warn(\n" ] } ], "source": [ "sc.pp.filter_genes(adata_omics1, min_cells=10)\n", "sc.pp.highly_variable_genes(adata_omics1, flavor=\"seurat_v3\", n_top_genes=2000)\n", "sc.pp.normalize_total(adata_omics1, target_sum=1e4)\n", "sc.pp.log1p(adata_omics1)\n", "# sc.pp.scale(adata_omics1)\n", "\n", "# sc.pp.filter_genes(adata_omics2, min_cells=10)\n", "sc.pp.highly_variable_genes(adata_omics2, flavor=\"seurat_v3\", n_top_genes=1000)\n", "# sc.pp.normalize_total(adata_omics2, target_sum=1e4)\n", "sc.pp.log1p(adata_omics2)\n", "# sc.pp.scale(adata_omics2)" ] }, { "cell_type": "code", "execution_count": 7, "id": "9fcb2c8a-06ef-469a-98a8-3615aada6956", "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=30)\n", "# adata_omics1.obsm['tensor']=adata_omics1[:, adata_omics1.var['highly_variable']].X.toarray()\n", "adata_omics1.obsm['tensor']=AgaeSMO_v1.pca(adata_omics1_high, n_comps=100)\n", "# Protein\n", "# adata_omics2 = AgaeSMO_v1.clr_normalize_each_cell(adata_omics2) \n", "# sc.pp.scale(adata_omics2)\n", "# adata_omics2_high = adata_omics2[:, adata_omics2.var['highly_variable']]\n", "adata_omics2.obsm['feat'] = AgaeSMO_v1.pca(adata_omics2, n_comps=30)\n", "# adata_omics2.obsm['tensor']=adata_omics2[:, adata_omics2.var['highly_variable']].X.toarray()\n", "# adata_omics2.obsm['tensor']=adata_omics2.X.toarray()\n", "adata_omics2.obsm['tensor']=AgaeSMO_v1.pca(adata_omics2, n_comps=100)" ] }, { "cell_type": "code", "execution_count": 8, "id": "b9466d72-8ee8-46f2-9ca0-359b9809f1bc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "------Calculating spatial graph...\n", "The graph contains 15568 edges, 2675 cells.\n", "5.8198 neighbors per cell on average.\n", "------Calculating spatial graph...\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": [ "The graph contains 9510 edges, 2438 cells.\n", "3.9007 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,4,k=6)" ] }, { "cell_type": "code", "execution_count": 9, "id": "437a9b35-8805-433f-8734-2d6d51a657b6", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "spot number is not equal,adding graph transfer\n", "torch.Size([2675, 100]) torch.Size([2438, 100])\n", "dim_input1 100 dim_input2 100 \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=14\n", "tool = 'mclust' # mclust, leiden, and louvain  \n", "AgaeSMO_v1.clustering(adata,refine_=True, key='AgaeSMO', add_key='AgaeSMO', n_clusters=n_cluster, method=tool, use_pca=True)# visualization\n", "import matplotlib.pyplot as plt\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='AgaeSMO', s=80, show=False)\n", "\n", "plt.tight_layout(w_pad=0.3)\n", "plt.show()\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "5c266858-33db-45ed-afe5-381c240d8c7e", "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 }