实验记录 | 如何拆分scATAC-seq数据成为单个细胞?(1、解决barcode问题)

在师兄的帮助下,我得到了师兄筛选过的细胞的barcode的数据,那么接下来我想根据这些barcode,将来源于同一个barcode的细胞的reads提取出来,这个还是一个蛮有技术含量的事情的,因为上次我有使用过perl的脚本进行提取,最后的实验结果很糟糕,故而这件事情一直搁置到现在,没有继续去做(我的脚本的编写能力还是有待于加强,可能是刚刚喝了奶茶,和老妈弟弟聊了好多闲话,很开心,觉得在某种程度上休息够了,对于工作也是一种非常快乐和积极的状态了)。

0。前期失败尝试回顾

#! perl
#这个代码的主要的功能:
#读取barcode文件的@行,其他行都一样其实没啥意义
#得到这个list之后
#然后分别到文件R1和R3中查找。
#如果能够找到?则提取其余下的4行,保存到一个新的文件中。以此遍历,直到读取到该文件的最后一行为止。
#总的来说,需求是非常简单的,现在不行也要上了。
my $barcode=$ARGV[0];
my $R1=$ARGV[1];
my $R3=$ARGV[2];
my $newR1=$ARGV[3];
my $newR3=$ARGV[4];

print '$ARGV[0]==>',$ARGV[0],"\n",
      '$ARGV[1]==>',$ARGV[1],"\n",
	  '$ARGV[2]==>',$ARGV[2],"\n",
	  '$ARGV[3]==>',$ARGV[3],"\n",
	  '$ARGV[4]==>',$ARGV[4],"\n";

my @ID=();
my @linelist;
my @strArr;
my @strR1;
my @strBrr;
my @strR3;
#读取barcode文件的@行
open (MARK, "< $barcode") or die "can not open it!";
while ($line = <MARK>){ 
       if ($line =~m/^@/){
		   push(@ID,$line);
} 
}
#print @ID;
close(MARK);
#print $ID[0]; #这个需求到这里就算是完成了,我们的数据保存在了数组@ID中
#@strArr=split(/ /,$ID[0]);
#print "$strArr[0]\n";

open (R1,"+< $R1") or die "can not open R1 !";
open (NEWR1,"> $newR1")or die "can not open new file!";
$/ ="\n";
@linelist=<R1>;
#print $linelist[1];
#while ($line=<R1>){
#	print $line;
#	
#}
#my $i =0;
for ($i=0;$i<$#linelist+1;$i=$i+4){
	#print $linelist[$i];
	@strR1=split(/ /,$linelist[$i]); #这个R1就是序列1
	my $m =$strR1[0];
	#print $m;
	#print "$strR1[0]\n";
	for ($j=0;$j<$#ID+1;$j=$j+1){
		@strArr=split(/ /,$ID[$j]);
		my $n = $strArr[0];
		#print $n;
		if ($n eq $m){
			#应该仅存在一一对应的关系
			#print "yes! \n";
			#到这里算是成功了,接下来就是把那四行写入一个新的文件中
			print NEWR1 "$linelist[$i]$linelist[$i+1]$linelist[$i+2]$linelist[$i+3]";
			#print "\n";
		}
	}
}
close(R1);
close(newR1);

open (R3,"+< $R3") or die "can not open R3 !";
open (NEWR3,"> $newR3")or die "can not open new file!";
$/ ="\n";
@linelist=<R3>;
#print $linelist[1];
#while ($line=<R1>){
#	print $line;
#	
#}
#my $i =0;
for ($i=0;$i<$#linelist+1;$i=$i+4){
	#print $linelist[$i];
	@strR3=split(/ /,$linelist[$i]); #这个R1就是序列1
	my $m =$strR3[0];
	#print $m;
	#print "$strR1[0]\n";
	for ($j=0;$j<$#ID+1;$j=$j+1){
		@strBrr=split(/ /,$ID[$j]);
		my $n = $strBrr[0];
		#print $n;
		#print "$j\n\n";
		 if ($n eq $m){
			#应该仅存在一一对应的关系
			#print "yes! \n";
			#到这里算是成功了,接下来就是把那四行写入一个新的文件中
			print NEWR3 "$linelist[$i]$linelist[$i+1]$linelist[$i+2]$linelist[$i+3]";
			#print "\n";
			print "yes!aligned!\n";
			last;
		}
		#print "$j\n\n";
	}
}
close(R3);
close(newR3);

这个代码对于我们的三个bam文件有几百万行的数据,而且要逐行的去判断,代码直接就崩掉了(被无情的killed)。现状非常的惨烈。因此我觉得虽然这个代码他能够解决比较简单的问题,但是对于我们的数据而言是不太适用的,还是要看看别人是怎样处理的。

1。scATAC-seq数据的基本结构

在这里插入图片描述

注明,经过我多次失败的尝试得到了的关于结构方面比较重要的信息:
A、spacer 所有reads中都一样,为CGCGTCTG(或其逆反序列)
B、index 用来标记样本(不同的脑区),每一种样本有四种类型的index(随机)
C、在我们的数据中,10X+spacer 这24bp的顺序是,8bp的spacer+16bp的10Xbarcode,由于前期没有意识到barcode是其逆反的序列,所以一直找不到匹配的细胞的barcode信息。

针对于上面的这张图,我能够得到与我拆分数据相关的几个重要的信息:
(1)R1和R3是151bp的双端DNA的序列(可能测通,可能要考虑需不需要trim一下)
(2)来源于同一对的双端的序列共用同一个序列号。
(3)前面的两点都是针对于同一条序列的。那么怎么判断这些序列是否来源于同一个细胞呢?
我想主要是通过两方面的因素:

  • R2存放有文库的10Xbarcode+Spacer的数据,且有对应的ID
  • 来源于同一个细胞的reads会具有相同的10Xbarcode
(base) [xxzhang@fat01 V1C]$ head ATAC_S1_20210413NA_S2_L002_R1_001.fastq
@A00928:207:HYLCHDSXY:2:1101:1072:1031 1:N:0:TTCTACAG
GNGAGAGAGAGAGACCAATGGATCAGGTTCATTTAGCACCTGAAAGGGGGTGGTGTTTGGGGACAGAGAGACCTTTGGAGTTCCAGCTTAAGGGTATCAG                                                                                                                                         CCTCCCTGGCTGATGTAAGTCAGAGGCCTCTTATACCCACTTTGATGAGGA
+
F#FFF,FFF,FFF:FFFFFFFFFFFFF:FFFFFFFFFFF:FFFFFFF,FFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFF::FFFFFFFFFFFFFFF                                                                                                                                         FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
@A00928:207:HYLCHDSXY:2:1101:1452:1031 1:N:0:TTCTACAG
CNCCATGGCAGCAACTGGCTGCTGAGTCAGATCCATGCCCACAGAAGCTCATCTTGAGCCCTTGGGTGCCTGATTTACATTCAGGAAGACATTGGCATTA                                                                                                                                         GGGACTGTCTCTTATACACATCTCCGAGCCCACGAGACTTCTACAGATCGC
+
F#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF                                                                                                                                         FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,,
@A00928:207:HYLCHDSXY:2:1101:1470:1031 1:N:0:AGACTTTC
CNGTTGTGCAGGAATCAGCAGCGCACTGGGTCTGGTAATACAACTGTCTCTTATACACATCTCCGAGCCCACGAGACAGACTTTCATCTCGTATGCCGTC                                                                                                                                         TTCTGCTTGAAGCGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
(base) [xxzhang@fat01 V1C]$ head ATAC_S1_20210413NA_S2_L002_R3_001.fastq
@A00928:207:HYLCHDSXY:2:1101:1072:1031 3:N:0:TTCTACAG
GGTAGGTTCCAGTATCTGAGGGGTGGACGTCAGTCAGTTTCAGTGTGGCCACCCCCACTGTGGGGGGGTTCTGAAGCAGGCTGACCCGCTTTGACTTAGA                                                                                                                                         ACCAGTTGGATACAGATGGCCATTGGTGAAGTACAGGATCTGGGGAGAGGC
+
FFFFFFF:FFFFF:FFFFFFFFFF:FFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFF:FFFFFFFFFF::                                                                                                                                         FFFFFFFFFFFFFF:FFFF,FFFFFFFFFFFFFFFFFFFFFFFFFFFFF:F
@A00928:207:HYLCHDSXY:2:1101:1452:1031 3:N:0:TTCTACAG
TCCCTAATGCCAATGTCTTCCTGAATGTAAATCAGGCACCCAAGGGCTCAAGATGAGCTTCTGTGGGCATGGATCTGACTCAGCAGCCAGTTGCTGCCAT                                                                                                                                         GGAGCTGTCTCTTATACACATCTGACGCTGCCGACGACAGACGCGTACTTG
+
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF                                                                                                                                         FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
@A00928:207:HYLCHDSXY:2:1101:1470:1031 3:N:0:AGACTTTC
TTGTATTTCCAGACCCAGTGCGCTGCTGATTCCTGCACAACTGCTGTCTCTTATACACATCTGACGCTGCCGACGACAGACGCGCAGTTTACTGGTTAAA                                                                                                                                         GTGTAGATCTCGGTGGTCGCCGTATCATTAAAAAGGGGGGGGGGGGGGGGG


  • 我们通过统计R2文件中的16bp的10X barcode的序列是否在师兄给我的那个list中,来判断这一假说是否成立。
  • 另外,我们也可以通过统计R2文件中的16bp的10X barcode的序列的数目,来判断理论上来源于同一个细胞的reads有多少个,来判断这一假说是否成立。

那么接下来,我就来验证这个假说是否正确。
在验证的过程中,我发现了比较有意思的现象。
(1)在我的R2的数据中能够找到很多序列的barcode,在师兄的文件中找不到。
(2)而我选择师兄文件中的barcode,在我的R2的文件中找不到。
就是说两者没有很好的一一对应的关系,具体问题出在什么地方,还需要进一步的核实。
在这里插入图片描述
在这里插入图片描述
目前原因不明。
接下来,我想验证一些有趣的东西。
(1)上一种方法统计的感兴趣的基因的reads数和我们htseq统计结果进行比较,看看差别。

chr5_80029677_SINE_AluY 40
#我们自己计数的结果是有52个,差别在可以接受的范围内(其实还可以随机的去抽取,看看htseq的结果是否都比我们统计到的小,具体还可以看一下htseq处理的细节)。

(2)从序列名反推这些序列所在的细胞的类型,看看是否可以找到一些联系。现在就手动的去做这样的一件事。

A00928:207:HYLCHDSXY:2:1108:31729:24533
CAGACGCGCCACAAAGAGCAAGAA
A00928:207:HYLCHDSXY:2:1114:14760:1939
CAGACGCGTAAGGTTACCTAGCGA
A00928:207:HYLCHDSXY:2:1116:22978:29136
CAGACGCGACTGAATGAGCTGCAA
A00928:207:HYLCHDSXY:2:1144:25898:22075
CAGACGCGATGTGATGAGCTAAAT
A00928:207:HYLCHDSXY:2:1148:2989:18380
CAGACGCGTTGGCTGCTAACCTTG
A00928:207:HYLCHDSXY:2:1153:7075:29810
CAGACGCGAACTGAGTGATTCAAC
A00928:207:HYLCHDSXY:2:1161:21332:16235
CAGACGCGTAACCGTTGTGGGTGA
A00928:207:HYLCHDSXY:2:1162:8305:16752
CAGACGCGCAGAACCACTGCACAG
A00928:207:HYLCHDSXY:2:1212:30472:30248
CAGACGCGTCGAAGCACTAACGAT
A00928:207:HYLCHDSXY:2:1227:6017:22091
CAGACGCGCGTAAAGCTGATGGAC
A00928:207:HYLCHDSXY:2:1260:3812:27226
CAGACGCGCGTAGTAGAGGATGTC

A00928:207:HYLCHDSXY:2:1301:9263:4946
CAGACGCGGTTGACCTGCAATAAG

A00928:207:HYLCHDSXY:2:1302:7392:3302
CAGACGCGGGTGCGTACGTCCATC

A00928:207:HYLCHDSXY:2:1315:6958:21402
CAGACGCGGATGCAGCTAACGGTG

A00928:207:HYLCHDSXY:2:1322:30219:24893
CAGACGCGCCGCTTAGATGTTGTT

A00928:207:HYLCHDSXY:2:1405:17146:30279
CAGACGCGAAGCCTAACTGTCAGG

A00928:207:HYLCHDSXY:2:1474:2338:7138
CAGACGCGAGTAACCACTCACCTA

A00928:207:HYLCHDSXY:2:1612:2492:1329
CAGACGCGATAAGCCACCTCATCA

A00928:207:HYLCHDSXY:2:1612:18728:8249
CAGACGCGCGGCCTTACGGGCGTT

A00928:207:HYLCHDSXY:2:1663:7916:24878
CAGACGCGGTGGCCAACGGGTTTG

A00928:207:HYLCHDSXY:2:1669:12563:15890
CAGACGCGTAAGGTTACCTAGCGA

A00928:207:HYLCHDSXY:2:2107:20564:34976
CAGACGCGGCTAAATGAGTCAAGC

A00928:207:HYLCHDSXY:2:2136:5195:35603
CAGACGCGTAATCCTGAAATAACC

A00928:207:HYLCHDSXY:2:2137:1081:11882
CAGACGCGGCAACGGTGCTGTGAT

A00928:207:HYLCHDSXY:2:2151:16902:13416
CAGACGCGTAAGGTTACCTAGCGA

A00928:207:HYLCHDSXY:2:2166:15519:19006
CAGACGCGCGATTAGGAACCAGGT

A00928:207:HYLCHDSXY:2:2167:3025:10081
CAGACGCGGCCAGCTCTTAGGCGG

A00928:207:HYLCHDSXY:2:2212:28556:1720
CAGACGCGATTGGTGACCTTTAGC

A00928:207:HYLCHDSXY:2:2216:1931:8437
CAGACGCGCGAGTTAGAGGTAATT

A00928:207:HYLCHDSXY:2:2259:28085:19319
CAGACGCGAAGCTATGACCGTTGT

A00928:207:HYLCHDSXY:2:2265:5367:1799
CAGACGCGACAACTAGAACCAGGT

A00928:207:HYLCHDSXY:2:2318:24650:35790
CAGACGCGCTTAGTGTGGGCGTGA

A00928:207:HYLCHDSXY:2:2326:18448:20791
CAGACGCGAAGCCTAACTGTCAGG

A00928:207:HYLCHDSXY:2:2329:29704:9659
CAGACGCGTGCTTCCTGTTGCGGC

A00928:207:HYLCHDSXY:2:2337:28420:8249
CAGACGCGGGTTATCCTATTGAGA

A00928:207:HYLCHDSXY:2:2349:19072:19460
CAGACGCGTTACAACCTAGCCACC

A00928:207:HYLCHDSXY:2:2368:11153:36432
CAGACGCGGAATATCGATATTTGC

A00928:207:HYLCHDSXY:2:2416:28682:20071
CAGACGCGTAATCCGGAAATAACC

A00928:207:HYLCHDSXY:2:2419:4399:22200
CAGACGCGTAAGGTTACCTAGCGA

A00928:207:HYLCHDSXY:2:2422:25807:26710
CAGACGCGCGCTAAAGACACCTTG

A00928:207:HYLCHDSXY:2:2425:26919:26663
CAGACGCGTCGAAGCACTAACGAT

A00928:207:HYLCHDSXY:2:2446:4788:26819
CAGACGCGCATAATCCTCATGCGT

A00928:207:HYLCHDSXY:2:2451:32669:17174
CAGACGCGCGATTAGGAACCAGGT

A00928:207:HYLCHDSXY:2:2503:11785:21402
CAGACGCGATAAGCCACCTCATCA

A00928:207:HYLCHDSXY:2:2612:19524:15734
CAGACGCGCGGCCTTACGGGCGTT

A00928:207:HYLCHDSXY:2:2613:21847:3537
CAGACGCGCGGCCTTACGGGCGTT

A00928:207:HYLCHDSXY:2:2615:32199:32675
CAGACGCGCCGCTTAGATGTTGTT

A00928:207:HYLCHDSXY:2:2615:31566:33207
CAGACGCGCCGCTTAGATGTTGTT

A00928:207:HYLCHDSXY:2:2667:20663:29951
CAGACGCGACAGCCTTGCATCACA

A00928:207:HYLCHDSXY:2:2668:7139:28855
CAGACGCGCCTAAGCCTGAGCAAC

A00928:207:HYLCHDSXY:2:2668:13901:34303
CAGACGCGTTACAACCTAGCCACC

A00928:207:HYLCHDSXY:2:2677:12689:32737
CAGACGCGGCAACGGTGCTGTGAT

现在这个barcode对应不上的问题,成了我的主要矛盾。我现在想批量的去验证一下,究竟有多少barcode,能够与师兄的数据匹配上。

(1)提取R2文件的对应的序列的行,保存到文件中barcode.txt
第2行,第6行,第10行。。每次加上4
(2)提取barcode.txt的前16bp的序列,保存到文件中barcode_16.txt
(3)使用uniq函数,对barcode_16.txt的数据进行排序(计数,可选)。

现在进行一步步的处理:
(后面有明白问题的原因,所以处理思路和上面写的已经有所变化)

# 步骤1:
分为两步,先使用sed提取偶数行
 sed -n '2~2p' ATAC_S1_20210413NA_S2_L002_R2_001.fastq >sed_oushu.txt
第二小步骤,使用sed提取sed_oushu.txt的奇数行,就是我们想要得到的对应的barcode的数据
 sed -n '1~2p' sed_oushu.txt >sed_jishu.txt
#步骤2
 awk -F "" '{for(i=9;i<=24;i++) {printf $i""};printf "\n"}' sed_jishu.txt >barcode.txt
#步骤3
取逆反序列,这个可能要使用perl程序来做这样一件事。将以下程序保存为文件名:reverse.pl
#!perl
my $barcode=$ARGV[0];
my $R1=$ARGV[1];
print '$ARGV[0]==>',$ARGV[0],"\n";
print '$ARGV[1]==>',$ARGV[1],"\n";

open (MARK, "< $barcode") or die "can not open it!";
open (NEWR1,"> $R1")or die "can not open new file!";
my $line;
my $line_rev;
while ($line = <MARK>){
	$line=~ s/[\n\r]//g;
    #print $line;
    #print "###########\n";	
	$line=~tr/CATG/GTAC/;
	$line_rev =reverse $line;
	print NEWR1 "$line_rev\n";
} 
close (MARK);
close (NEWR1);
#最终实现了barcode的转换。

perl reverse.pl barcode.txt barcode_cov.txt
$ARGV[0]==>barcode.txt
$ARGV[1]==>barcode_cov.txt
#步骤4:排序,取unique的barcode
sort
uniq

我们最终得到了一个正常的barcode的list。

2。单个细胞拆分的思路

(1)看看unique的barcode有多少个

(base) [xxzhang@mu02 V1C]$ cat barcode_cov.txt |wc -l
691467535
(base) [xxzhang@mu02 V1C]$ sort barcode_cov.txt >barcode_sort.txt
(base) [xxzhang@cu08 V1C]$ cat barcode_sort.txt |uniq -c >barcode_count.txt
(base) [xxzhang@cu08 V1C]$ cat barcode_count.txt |wc -l
3666868

(2)将得到的这个barcode的list和师兄的细胞的barcode进行合并。

setwd("F://张秀秀//过程性文件//10//4//barcode")
data<-read.csv("V1C_53.csv")
#subdata<-subset(data,Region=="V1C")
#write.csv(subdata,"V1C_53_2.csv",)
data2<-read.csv("V1C_per_barcode_metrics.csv")
#data3<-read.csv("V1C_53.csv")
dataset<-merge(data,data2,by="gex_barcode")
dim(dataset)
write.csv(dataset,"merge_converse.csv",row.names = F)
###############################################
barcode<-read.table("barcode_count.txt")
colnames(barcode)<-c("count","atac_barcode")

sub<-merge(dataset,barcode,by="atac_barcode")
dim(sub)
dim(dataset)
write.csv(sub,"merge_sub.csv",row.names = F)

通过对barcode的分析,我们的原始的文档中有很多的barcode,但是实际上,我们只需要对师兄筛选后的这些细胞(大概有10000个)的reads进行提取即可。

(3)细胞拆分的基本的思路

和scRNA-seq数据不同的是,scATAC-seq数据没有基于数据本身的标签。
现在已有的思路(1)是:
首先,根据barcode(师兄提供的)对其进行逆反一下,
然后截取R2(四个为一组)的第二行reads数的第[8:24]的碱基,保存为一个变量
然后将变量与师兄的barcode进行比较,如果顺利的比对上
提取该部分到一个文件中(和我下午尝试的代码的原理是类似的),保存。
剩余的部分就是根据对应的序列号,分别提取R1和R3对应的reads,分别保存为双端的文件夹中。
然后就是批量的常规的操作了。

接下来,放到下一步骤中完成。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值