这里的特斯拉不是电动车,是一个最近(May 17,2023)发表在Cell Systems 上的一个用于空间转录组数据分析的工具。TESLA (Tumor Edge Structure and Lymphocyte multi-level Annotation)
原文链接:https://www.sciencedirect.com/science/article/pii/S2405471223000844
试了一下感觉这个包有点意思,我的理解是这个包大概就是利用神经网络CNN算法提高空间转录组的分辨率,使得你的分析不在局限于硬件的限制。
似乎作者的本意是用这个工具来分析肿瘤组织的, 但是这里我把它搬过来分析一个从10X下载的老鼠脑切片数据, 原教程还利用肿瘤标记基因分析了肿瘤的边缘,这里省去了,一方面是因为我用的数据没有肿瘤,标记基因不适用,另外,强行使用会因为部分因表达为0,导致报错, 给作者报了bug,不知道会不会改。
此处有更详尽的原教程:https://github.com/jianhuupenn/TESLA/blob/main/tutorial/tutorial.md
## 导入需要的包
import os,csv,re, time
import pickle
import random
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
import numpy as np
from scipy import stats
from scipy.sparse import issparse
import scanpy as sc
import matplotlib.colors as clr
import matplotlib.pyplot as plt
import cv2
import TESLA as tesla
# Read in data
from scanpy import read_10x_h5
## expression_matrix.h5
adata = read_10x_h5("./Documents/visiumTutorial/outs/filtered_feature_bc_matrix.h5")
spatial=pd.read_csv("./Documents/visiumTutorial/outs/spatial/tissue_positions_list.csv",sep=",",header=None,na_filter=False,index_col=0)
adata.obs["x1"]=spatial[1]
adata.obs["x2"]=spatial[2]
adata.obs["x3"]=spatial[3]
adata.obs["x4"]=spatial[4]
adata.obs["x5"]=spatial[5]
# 为了方便后续操作,需要改下anndata obs 的名称,其实也可以在上面命名的时候就改好
name_mapping = {
'x2': 'pixel_x',
'x3': 'pixel_y',
'x4': 'array_x',
'x5': 'array_y',
}
adata.obs.rename(columns=name_mapping, inplace=True)
#Select captured samples
adata=adata[adata.obs["x1"]==1]
adata.var_names=[i.upper() for i in list(adata.var_names)]
adata.var["genename"]=adata.var.index.astype("str")
# 保存备用
adata.write_h5ad("./Documents/visiumTutorial/sample_data.h5ad")
# Preprocessing
resize_factor=1000/np.min(img.shape[0:2])
resize_width=int(img.shape[1]*resize_factor)
resize_height=int(img.shape[0]*resize_factor)
counts.var.index=[i.upper() for i in counts.var.index]
counts.var_names_make_unique()
counts.raw=counts
sc.pp.log1p(counts) # impute on log scale
if issparse(counts.X):counts.X=counts.X.A
# Contour detection
#原教程提供了三种方法,这里只使用第一种
cnt=tesla.cv2_detect_contour(img, apertureSize=5,L2gradient = True)
binary=np.zeros((img.shape[0:2]), dtype=np.uint8)
cv2.drawContours(binary, [cnt], -1, (1), thickness=-1)
#Enlarged filter
cnt_enlarged = tesla.scale_contour(cnt, 1.05)
binary_enlarged = np.zeros(img.shape[0:2])
cv2.drawContours(binary_enlarged, [cnt_enlarged], -1, (1), thickness=-1)
img_new = img.copy()
cv2.drawContours(img_new, [cnt], -1, (255), thickness=50)
img_new=cv2.resize(img_new, ((resize_width, resize_height)))
cv2.imwrite('./Documents/visiumTutorial/cnt.jpg', img_new)
#Gene expression enhancement
#Set size of superpixel
res=10
# 这个数值可以根据情况改,原教程的25 不适用这组数据
enhanced_exp_adata=tesla.imputation(img=img, raw=counts, cnt=cnt, genes=counts.var.index.tolist(), shape="None", res=res, s=1, k=2, num_nbs=10)
#Plot gene expression image
cnt_color = clr.LinearSegmentedColormap.from_list('magma', ["#000003", "#3b0f6f", "#8c2980", "#f66e5b", "#fd9f6c", "#fbfcbf"], N=256)
#随便挑了一个基因
gene="LHX2"
enhanced_exp_adata.obs[g]=enhanced_exp_adata.X[:,enhanced_exp_adata.var.index==gene]
fig=sc.pl.scatter(enhanced_exp_adata,alpha=1,x="y",y="x",color=gene,color_map=cnt_color,show=False,size=2)
fig.set_aspect('equal', 'box')
fig.invert_yaxis()
plt.gcf().set_dpi(600)
fig.figure.show()
结果显然似乎更细腻了,但是至于是真是假就不知道了