全网首发,用于单细胞ATAC分析的Socrates包

Socrates是一款用于分析snATAC数据的R语言包,但是该包发表后并没有引起多大水花,最直观的就是,Github上该包的Issues只有10条,其中两条还是本人最近贡献的。这里附上Socrates的Github链接:https://github.com/plantformatics/Socrates

image-20240315200834656.png

虽然这个包没啥人用,但是由于本人爱折腾,最终还是尝试了一把,接下来讲一些使用该包的技巧,绝对是全网首发!!!

第一步:读取输入文件

输入文件总共需要3个,分别是Tn5结合位点文件,基因组的gff注释文件,基因组染色体长度文件。

但是通常情况下,我们上游通过cellranger-atac得到的是fragment文件,这是需要在读取时设置is.fragment=T。

image-20240220131126147.png
library(Socrates)
#读取文件
bed="SampleName.fragments.tsv.gz"
ann="genome.gff3"
chr="genome.chr.bed"
#建立obj,注意Socrates包默认的bed为包含正负链信息的单碱基Tn5插入位点,但我们的fragment文件是从cellranger-atac中得到的,因此在读取时需要设置is.fragment=T
obj=loadBEDandGenomeData(bed,ann,chr,is.fragment=T)

这里仍然存在一个小问题就是如果fragment文件过大的话,是无法读取的,这里需要自行将fragment文件转换成单碱基的Tn5插入位点文件,直接进行读取。至于转换的方式,则是根据cellranger-atac产生fragment文件的方式来逆向还原Tn5插入位点的位置。

cellranger-atac count的结果中会生成fragments.gz文件,其中每一个fragment是由两个独立的转座事件创造的,也就是说fragment的两端正好是两次Tn5酶插入的位点。每一个特异的fragment会产生多条冗余的reads,这些冗余的reads被折叠成单个fragment记录。

Fragment的位置信息是从bam文件中获得的。fragment的起点是将bam中的reads比对的位置最左侧向前移动4bp,终点是将reads比对位置的最右侧向后移动5bp。

image-20240226121554625.png

image-20240226122144735.png

因此将fragment文件中每条fragment的起点和终点都分别看做一个Tn5结合位点即可。

将fragment文件转换成Tn5结合位点文件

unpigz -p 24 -k SampleName.fragments.tsv.gz &&
echo "unpigz done" &&
awk '{print $1 "\t" $2 "\t" $2+1 "\t" $4 "\t" "+" }' SampleName.fragments.tsv > SampleName.start &&
echo "start done" &&
awk '{print $1 "\t" $3 "\t" $3-1 "\t" $4 "\t" "-" }' SampleName.fragments.tsv > SampleName.end &&
echo "end done" &&
cat SampleName.start SampleName.end | sort -k1,1 -k2,2n | uniq > SampleName.Tn5.sites.txt &&
echo "cat done" &&
pigz -p 24 SampleName.Tn5.sites.txt &&
echo "pigz done" &&

第二步:进行peak calling并过滤低质量的细胞

#call peak,鉴定ACRs
##output指定输出peak文件和peak的前缀,tempdir指定peak的输出目录
obj=callACRs(obj,genomesize=1.46e10,shift=-75,extsize=100,fdr=0.05,output="SampleName",tempdir="./SampleName")
#生成metadata
##注意这里生成metadata的时候需要提前call peak,否则不会计算frip,在后续的过滤过程中会出问题
obj=buildMetaData(obj,tss.window=3000)
head(obj$meta)
#过滤低质量的细胞
#findCells后会生成多个meta,分别为meta.v1,meta.v2,meta.v3,他们分别对应pdf图中的三次过滤,其中meta.v3为最终的过滤结果。
##min.cells和max.cells代表最低和最高的细胞数目
##min.tn5代表Tn5位点处最低的read depth
##filt.tss=T代表根据tss进行过滤
##tss.min.freq=0.2和tss.z.thresh代表reads比对到TSS位点处的比例超过0.2,同时z-score的阈值为3
##filt.frip=T代表根据frip进行过滤
##frip.min.freq=0.2代表细胞的frip需高于0.2并且z-score的阈值为3
obj=findCells(obj,doplot=T,prefix="S4-1",min.cells=1000,max.cells=15000,min.tn5=1000,filt.tss=T,tss.min.freq=0.2,tss.z.thresh=3,filt.frip=T,frip.min.freq=0.2,frip.z.thresh=3)
image-20240220142718291.png

这里在经过质控过滤后,Socrates并不会丢弃那些被过滤掉的细胞,而是增加多个meta来进行区分。

第三步:建立Socrates对象并进行下游分析

#生成Socrates对象
##filtered=T,指定用过滤后的细胞建立matrix,windows=1000指定基因组划窗的大小为500,peaks=F不适用peak文件进行定量,如果设置peaks=T,则对peak进行定量,并覆盖windows=500的参数。
obj=generateMatrix(obj,filtered=T,windows=500,peaks=F,verbose=T)
obj=generateMatrix(obj,filtered=T,peaks=T,verbose=T)
#将该对象转换为Socrates格式
soc.obj=convertSparseData(obj)
saveRDS(obj,file="QC_object.rds")
saveRDS(soc.obj,file="Socrates_object.rds")

#对Socrates对象进行过滤
cell.counts=Matrix::colSums(soc.obj$counts)
site.freq=Matrix::rowMeans(soc.obj$counts)
layout(matrix(c(1:2),ncol=2))
par(mar=c(3,3,1,1))
plot(density(cell.counts),main="Log10 cell counts",log="x")
abline(v=1000,col="red")
plot(density(site.freq),main="peak accessibility frequency",log="x")

#对Socrates对象进行过滤
##min.c设置每个细胞中accessible ACRs的最小值
##min.t过滤掉在细胞中出现频率低的ACRs
##max.t过滤掉在细胞中出现频率高的ACRs,默认为前0.005
soc.obj=cleanData(soc.obj,min.c=1000,min.t=0.005,max.t=0.005)

#Normalization
##
soc.obj=regModel(soc.obj,nthreads=16)
tfidf.obj=tfidf(soc.obj)
lr.obj=logisticModel(soc.obj,nthreads = 16)
regMod2.obj=refModel2(obj)

#SVD降维
##method="SVD"指定使用SVD降维,也可选择method="NMF"
soc.obj=reduceDims(soc.obj, n.pcs=50, cor.max=0.7, verbose=T)
soc.obj=reduceDims(soc.obj, n.pcs=50, cor.max=0.7, method="NMF")

#UMAP
soc.obj=projectUMAP(soc.obj, verbose=T)
plot(soc.obj$UMAP, pch=16, cex=0.2)

#Graph-based clustering
soc.obj=callClusters(soc.obj, res=0.6, verbose=T)
plotUMAP(soc.obj)
saveRDS(soc.obj, file="Socrates_object.rds")
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容