【单细胞转录组】将序列UMI映射到细胞聚类分群

一、需求背景

10X V5转录组vdj分析中,因为有一段特殊基因序列比对不上参考基因组,所以bam文件没有这个barcode信息。需要把R2的这段序列,根据序列ID从R1中找出R2序列与R1 barcode和UMI的对应关系,然后做UMI去重,统计数量,然后再映射到细胞聚类图中去看看这个序列的UMI表达量

二、思路分析

根据文库结构


图片来源:https://blog.csdn.net/herokoking/article/details/103629141

将目标序列作为比对参考模板,用R2文件进行blast比对,从比对结果中筛选出从3'到5’方向的,因为10X V5转录组的R2的测序方向就是3’到5’,然后再筛选出比对上序列长度大于等于85nt的子集,获得比对上fastq R2测序文件的reads的ID信息, 再通过seqtk工具查询在 fsatq R1文件根据ID提取出相应的序列信息。

从查询出来的序列中提取序列前1到16nt获取barcode,17到28nt获得UMI信息,经过barcode和UMI的序列去重、统计、分群的标签映射

流程图:

序列模板---->R2 blast比对----->过滤&提取ID---->seqtk提取R1序列--->barcode和UMI的序列去重-->数据统计--->分群的标签映射---->UMI表达量可视化分析

三、代码

3.1 blast比对

//www.greatytc.com/p/415cd1658157

#fastq转换为fasta
nohup less -S ../sample-*_L3_2.fq.gz |awk '{if(NR%4 == 1){print ">" substr($0, 2)}}{if(NR%4 == 2){print}}' > ./sample-*_L3_2.fasta &


# 数据库构建
makeblastdb \
 -dbtype nucl \
 -in artificial.fasta \
 -input_type fasta \
 -parse_seqids \
 -out artificial.blastdb

# 比对
##这里的*号表示4条R2序列的编号省略
blastn \
 -query sample-*_L3_2.fasta \
 -db artificial.blastdb \
 -out sample-*_results2.xls \
 -outfmt 6 \
 -num_threads 8

3.2 过滤比对上的reads2序列

cat ../sample-1_results2.xls |sort -nr -k4|awk '$4>=85 && $9>$10{print $0}' > map_sample-1.xls
cat ../sample-2_results2.xls |sort -nr -k4|awk '$4>=85 && $9>$10{print $0}' > map_sample-2.xls
cat ../sample-3_results2.xls |sort -nr -k4|awk '$4>=85 && $9>$10{print $0}' > map_sample-3.xls
cat ../sample-4_results2.xls |sort -nr -k4|awk '$4>=85 && $9>$10{print $0}' > map_sample-4.xls

3.3 R2 序列id获取

ls *.xls |cat |xargs awk '{print $1}' >query_ids2

3.3 合并R1序列方便后续查找操作

ls sample*_1.fq.gz |xargs less >sample_R1.fastq

3.4 使用seqtk工具根据R2 ID提取R1序列子集

seqtk安装、部署、使用方法参考:

# 输出fastq格式
$seqtk subseq   sample_R1.fastq query_ids2 >seqtk_result.tsv
# -t 参数:输出一种\t分隔格式,更方便后面的提取barcode操作
$seqtk subseq  -t sample_R1.fastq query_ids2 >seqtk_result2.tsv

3.5 barcode去重,用于生成有无表达特定序列的分组信息标签

cat seqtk_result2.tsv |cut -f3 |awk '{print substr($1, 1, 28)}' |sort |uniq |awk '{print substr($1,1,16)}' |sort |uniq >uniq_barcode.tsv

3.6 与关注细胞细分亚群的barcode进行取交集操作,过滤掉无关的序列

R:

cellType<-readRDS('cellType.rds')
write.table(gsub('-.*', '', rownames(cellType@meta.data)), file = 'cellType_barcode.tsv', sep = '\t', quote = F, col.names = F, row.names = F)

Linux:

# 取交集
sort cellType_barcode.tsv  uniq_barcode.tsv |uniq -d >cellType_intersect.tsv

3.7 根据barcode和UMI一起去重

cat seqtk_result2.tsv |cut -f3 |awk '{print substr($1, 1, 28)}' |sort |uniq >uniq_barcode_umi.tsv

3.8 统计每个细胞barcode相应的关注序列的UMI

cat uniq_barcode_umi.tsv |awk '{hash[substr($1, 1, 16)]+=1}END{for (i in hash){printf("%s\t%d\n", i, hash[i])}}' >count_umi.tsv

3.9 将分组信息和UMI信息映射到关注的分群聚类图中(数据可视化)

R:

library(plyr)
library(Seurat)
library(ggplot2)

#read barcode group label
interBarcodes<-read.table('cellType_intersect.tsv', sep = '\t', header = F)

#read UMI label
umi_count<-read.table('count_umi.tsv', sep='\t', header = F, col.names = c('barcode', 'umi'))

#mapping group label
cellType$artificial<-ifelse(gsub('-.*', '', rownames(cellType@meta.data))%in%interBarcodes$V1, 
       'artificial_gene', 'no_artificial_gene')

#mapping UMI label
cellType$artificial_gene<-mapvalues(gsub('-.*', '', rownames(cellType@meta.data)), as.character(umi_count$barcode), as.character(umi_count$umi))
cellType$artificial_gene<-as.numeric(cellType$artificial_gene)

#change the no expression UMI label from NA to 0
cellType$artificial_gene<-ifelse(is.na(cellType$artificial_gene), 0, cellType$artificial_gene)
head(cellType@meta.data)

# Visualize
DimPlot(cellType, group.by = 'artificial', reduction = 'tsne')
FeaturePlot(cellType, features = 'artificial_gene', reduction = 'tsne', label=T, cols = c('grey','red'), pt.size = 1)

参考文章

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

推荐阅读更多精彩内容