{ "cells": [ { "cell_type": "markdown", "id": "f9a5e963", "metadata": {}, "source": [ "# S2. Interoperability" ] }, { "cell_type": "markdown", "id": "d213899d", "metadata": {}, "source": [ "Here, we briefly demonstrate how the single-cell objects may be converted between R and python to run CCC analyses in either language:" ] }, { "cell_type": "code", "execution_count": 1, "id": "38d05c93", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Attaching SeuratObject\n", "\n", "Seurat v4 was just loaded with SeuratObject v5; disabling v5 assays and\n", "validation routines, and ensuring assays work in strict v3/v4\n", "compatibility mode\n", "\n", "Registered S3 method overwritten by 'SeuratDisk':\n", " method from \n", " as.sparse.H5Group Seurat\n", "\n", "Registered S3 method overwritten by 'zellkonverter':\n", " method from \n", " py_to_r.numpy.ndarray reticulate\n", "\n" ] } ], "source": [ "library(Seurat, quietly = TRUE)\n", "library(SeuratDisk, quietly = T)\n", "library(zellkonverter, quietly = TRUE)\n", "library(reticulate, quietly = TRUE)\n", "library('Matrix', quietly = T)\n", "anndata<-import('anndata')\n", "\n", "data.path <- file.path(\"..\", \"..\", \"data\")" ] }, { "cell_type": "markdown", "id": "8ba578d4", "metadata": {}, "source": [ "## to Python\n", "\n", "For use in Python, we can convert the SingleCellExperiment object generated in [Tutorial 1](./01-Preprocess-Expression.ipynb) to an Anndata object using zellkonverter. See the [companion supplementary python tutorial](../ccc_python/S2_Interoperability.ipynb) for loading these saved files." ] }, { "cell_type": "code", "execution_count": 2, "id": "c8bfc138", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# load file\n", "covid_data<-readRDS(file.path(data.path, 'covid_balf_norm.rds'))\n", "\n", "# save h5ad\n", "zellkonverter::writeH5AD(covid_data, \n", " X_name = 'logcounts', \n", " file.path(data.path, 'processed_fromR_toPython.h5ad'))" ] }, { "cell_type": "markdown", "id": "a07ee90b", "metadata": {}, "source": [ "We can also do the same for the Suerat object generated in [Supplementary Tutorial 0](./S0_Preprocess_Expression_Seurat):" ] }, { "cell_type": "code", "execution_count": 3, "id": "277b9351", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# load file\n", "covid_data<-readRDS(file.path(data.path, 'covid_balf_norm_seurat.rds'))\n", "\n", "# save as h5ad\n", "file.name<-file.path(data.path, 'processed_fromR_toPython_Seurat.h5Seurat')\n", "suppressMessages({\n", " SaveH5Seurat(covid_data, filename = file.name)\n", " Convert(file.name, dest = \"h5ad\", overwrite = TRUE)\n", "})" ] }, { "cell_type": "markdown", "id": "b6a5ddad", "metadata": {}, "source": [ "## from Python\n", "\n", "Here, we can load the expression matrices that were generated in the companion python script using AnnData and saved as h5ad files into Seurat:\n", "\n", "Here, we can load the data that was generated in the [python version of Tutorial l](../ccc_python/01-Preprocess-Expression.ipynb) using scanpy into a SCE object:" ] }, { "cell_type": "code", "execution_count": 4, "id": "7f21e9aa", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "data_path = file.path(\"..\", \"..\", \"data\")\n", "sce_frompython<-zellkonverter::readH5AD(file.path(data_path, 'processed.h5ad'))" ] }, { "cell_type": "markdown", "id": "e1c52d9f", "metadata": {}, "source": [ "We can also do the same into a Seurat object:" ] }, { "cell_type": "code", "execution_count": 5, "id": "963da3b5", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "adata_to_seurat<-function(adata){\n", "# raw<-adata$layers[['counts']]$to_adata()\n", "# raw.counts<-t(as.matrix(raw$X))\n", " raw.counts<-t(adata$layers[['counts']])\n", " rownames(raw.counts)<-rownames(adata$var)\n", " colnames(raw.counts)<-rownames(adata$obs)\n", "\n", " so<-CreateSeuratObject(counts=raw.counts, assay = 'RNA', meta.data = adata$obs)\n", "\n", " norm.counts<-t(as.matrix(adata$X))\n", "\n", " # whether HVGs were filtered for\n", " if (length(rownames(so)) == dim(norm.counts)[[1]]){\n", " rownames(norm.counts)<-rownames(so)\n", " }else{\n", " rownames(norm.counts)<-rownames(adata$var[adata$var$highly_variable,])\n", " }\n", " colnames(norm.counts)<-colnames(so)\n", "\n", " so@assays$RNA@data<-as(norm.counts, \"dgCMatrix\")\n", " so@assays$RNA@meta.features<-adata$var\n", " \n", " return(so)\n", "}" ] }, { "cell_type": "code", "execution_count": 6, "id": "0e628a4f", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Warning message in asMethod(object):\n", "“sparse->dense coercion: allocating vector of size 11.6 GiB”\n" ] } ], "source": [ "adata <- anndata$read_h5ad(file.path(data_path, 'processed.h5ad'))\n", "covid_data_fromPython <- adata_to_seurat(adata)" ] } ], "metadata": { "kernelspec": { "display_name": "R [conda env:ccc_protocols]", "language": "R", "name": "conda-env-ccc_protocols-r" }, "language_info": { "codemirror_mode": "r", "file_extension": ".r", "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", "version": "4.2.3" } }, "nbformat": 4, "nbformat_minor": 5 }