![]() |
玩足球的闹钟 · 脑肿瘤有哪些常见症状? | ...· 1 月前 · |
![]() |
不敢表白的啤酒 · 郭敬明回应"日韩"微博 ...· 5 月前 · |
![]() |
大气的针织衫 · 物理与天文学院原子分子光物理(AMO)与量子 ...· 10 月前 · |
![]() |
高大的金针菇 · USDT稳赚25亿美金PayPal盯上的稳定 ...· 1 年前 · |
![]() |
飞翔的枕头 · 看剧吧-《乐高大电影2原声版》喜剧片高清完整 ...· 1 年前 · |
第一步: 在 uniprot 下载UniProt 上植物dat格式的注释文件。
1 |
wget ftp://ftp.uniprot.org/pub/databases/uniprot/current_release/knowledgebase/taxonomic_divisions/uniprot_sprot_plants.dat.gz |
将两个dat合并到成一个文件
1 |
zcat uniprot_sprot_plants.dat.gz uniprot_trembl_plants.dat.gz > uniprot_plants.dat |
第二步: 从dat中提取fasta序列
1 |
dat=uniprot_plants.dat |
第三步: 建立DIAMOND或NCBI BLAST+索引
1 |
diamond makedb --in uniprot_plants_AC.fasta -d uniprot_plants_AC |
第四步: 使用DIAMOND或NCBI BLAST+进行比对
1 |
diamond blastp -d /data/database/UniProt-Plant/uniprot_plants_AC.dmnd -q proteins.fasta --evalue 1e-5 > blastp.outfmt6 |
第五步: 从DIMAMOND或NCBI BLAST+的比对结果中筛选每个query的最佳subject
1 |
python -m jcvi.formats.blast best -n 1 blastp.outfmt6 |
第六步: 使用add_annotation_from_dat.py(代码在 GitHub 上)根据blastp输出从dat中提取GO/KEGG/同源基因。运行在Python2/3环境中,需要安装BioPython
1 |
python ~/myscripts/add_annotation_from_dat.py blastp.outfmt6.best /data/database/UniProt-Plant/uniprot_plants.dat |
之后会输出swiss_annotation.tsv, 输出信息包括如下几列
NECAT是肖传乐老师团队开发的一个针对Nanopore数据组装的软件,目前该工具尚未发表,除了 https://github.com/xiaochuanle/NECAT 有软件的介绍外,暂时没有中文资料介绍NECAT的使用。
太长不看的结论 : Nanopore的组装推荐用下NECAT。组装之后是先用MEDAKA做一遍三代polish,然后用NextPolish默认参数做二代polish。
这篇将会以一篇发表在Nature Communication上的拟南芥nanopore数据介绍如何使用NECAT进行组装,运行在CentOS Linux release 7.3.1611 (Core),64G为内存, 20线程(Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz),下面是正文。
NECAT可以在 https://github.com/xiaochuanle/NECAT/releases/ 页面获取最新的软件下载地址,这里下载的是0.01版本。
1 |
wget https://github.com/xiaochuanle/NECAT/releases/download/v0.01/necat_20190307_linux_amd64.tar.gz |
目前0.01版本不支持gz文件作为输入,但后续版本应该会支持。
目前更新到
necat_20200119_Linux-amd64
,新版本安装方法为
1 |
wget https://github.com/xiaochuanle/NECAT/releases/download/SourceCodes20200119/necat_20200119_Linux-amd64.tar.gz |
新版本增加gz文件支持。目前测试发现文件名需要符合
xxx.fastq
或
xxx.fastq.gz
命名格式,对于
fq.gz
无法识别,会导致程序文件出错。
1 |
mkdir NECAT && cd NECAT |
以发表在NC上的拟南芥数据为例, 下载该数据
1 |
# 三代测序 |
第二步 : 创建配置文件
1 |
necat.pl config ath_config.txt |
配置文件中,主要修改如下几个参数
1 |
PROJECT=athaliana #项目名 |
参数中还有一个,NUM_ITER=2,它并非是简单的重复2次纠错,它的每一轮的校正目的其实不同,第一轮的优先级是敏感度(senstitive), 第二轮之后主要追求速度(fast)。
除了上面的配置参数外,其他参数可以不需要修改,使用默认的值即可。需要修改的话,参考最后的参数说明部分。
第三步 : 序列纠错
1 |
necat.pl correct ath_config.txt & |
纠错后的reads在
athaliana/1-consensus/cns_final.fasta
cns_finla.fasta
的统计信息会输出在屏幕中, 或者自己用
fsa_rd_stat
也能得到同样的结果
1 |
Count: 206342 |
此外我还用time获取了运行时间,纠错花了大概一个小时。
1 |
real 55m31.451s |
第四步 : contig组装
1 |
necat.pl assemble ath_config.txt & |
结果在
athaliana/4-fsa/contigs.fasta
关于
contigs.fata
统计信息会输出在屏幕上,同样用
fsa_rd_stat
也可以。
1 |
Count: 162 |
时间用了75分钟
1 |
real 74m53.127s |
第五步 : contig搭桥
1 |
necat.pl bridge ath_config.txt |
结果在
athaliana/6-bridge_contigs/bridged_contigs.fasta
1 |
Count: 127 |
从N50和N75可以看出这一步会提高组装的连续性。
对Nanopore组装结果进行polish的常用软件有下面3个
由于拟南芥的基因组比较小,我分别用了Medaka和racon对输出结果进行polish(因为没有原始信号数据,因此nanopolish用不了),代码如下
Medaka
1 |
NPROC=20 |
三轮Racon:
1 |
gzip -dc ERR2173373.fastq.gz > ERR2173373.fastq |
在后续评估质量的时候,我发现单纯用三代polish的结果还不是很好,因此我用他们提供的二代测序,用NextPolish对NECAT的结果进行polish。
1 |
# 二代测序 |
run.cfg内容如下, 其中sgs.fofn记录的就是解压后的ERR2173372_1.fastq和ERR2173372_2.fastq的路径
1 |
[General] |
我考虑了两种情况,一种是直接用二代polish,另一种是三代polish之后接二代polish。
用Minimap2 + dotPlotly 绘制CANU,NECAT和拟南芥参考基因组的共线性图
1 |
minimap2 -t 20 -x asm5 Athaliana.fa NECAT.fa > NECAT.paf |
NECAT的结果
CANU的结果
NECAT和CANU都和参考基因组有着良好的共线性,但是NECAT的连续性更好,几乎成一条直线。
之后,我使用了 QUAST 来评估Canu,NECAT初步组装,NECAT用Medaka, nanopolish和racon纠错的结果(MD: MEDAKA, RC: RACON, NP:NextPolish)。
1 |
quast.py -t 100 --output-dir athaliana --circos \ |
一些描述基本信息
1 |
CANU N50 = 4875070, L50 = 7, Total length = 114689024, GC % = 36.09 |
在BUSCO完整度上, 以embryophyta_odb10作为物种数据库, 其中ONTmin_IT4是发表的文章里的结果, Athalina则是拟南芥的参考基因组,我们以它们的BUSCO值作为参照。
1 |
Athalina : C:98.6%[S:98.0%,D:0.6%],F:0.4%, M:1.0%, n:1375 |
二代Polish后的BUSCO结果如下(MD: MEDAKA, RC: RACON, NP:NextPolish):
1 |
Athalina : C:98.6%[S:98.0%,D:0.6%],F:0.4%,M:1.0%,n:1375 |
从以上这些数据,你可以得到以下几个洞见:
结论 : Nanopore的组装建议用NECAT。组装之后是先用MEDAKA做一遍三代polish,然后用NextPolish默认参数做二代polish。
下面这些参数相对简单,不需要过多解释,按照自己需求修改
以下的参数则是需要根据到具体的软件中去查看具体含义,需要和软件开发者讨论
oc2pmov
oc2pmov
oc2cns
oc2cns
oc2asmpm
oc2asmpm
fsa_ol_filter
fsa_assemble
fsa_ctg_bridge
scATAC-seq : h5格式
scATAC-seq metadata : csv文件
scRNA-seq : h5格式
可以复制下载链接到浏览器下载,也可以直接在R语言用
download.file
中进行下载。
1 |
# 下载peak |
1 |
library(Seurat) |
activity.matrix是一个
dgCMatrix
对象,其中行为基因,列为细胞。因此如果对于Cicero的输出结果,只要提供相应的矩阵数据结构即可。
下一步,我们要来设置
Seurat
对象,将原始的peak counts保存到assay中,命名为”ATAC”
1 |
pbmc.atac <- CreateSeuratObject(counts = peaks, assay = "ATAC", project = "10x_ATAC") |
增加基因活跃度矩阵,命名为”ACTIVITY”.
1 |
pbmc.atac[["ACTIVITY" ]] <- CreateAssayObject(counts = activity.matrix) |
增加细胞的元信息,该信息来自于scATAC-seq的CellRanger处理的singlecell.csv
1 |
meta <- read.table(singlecell_file, sep = ",", header = TRUE, row.names = 1, |
过滤掉scATAC-seq数据中总count数低于5000的细胞,这个阈值需要根据具体实验设置
1 |
pbmc.atac <- subset(pbmc.atac, subset = nCount_ATAC > 5000) |
为了找到scATAC-seq数据集和scRNA-seq数据集之间的锚定点,我们需要对基因活跃度矩阵进行预处理
设置pbmc.atac的默认Assay为”ACTIVITY”, 然后寻找高表达的基因,对基因活跃度矩阵进行标准化和Scale。
1 |
DefaultAssay(pbmc.atac) <- "ACTIVITY" |
同样的,我们还需要对peak矩阵进行处理。这里我们用的隐语义(Latent semantic indexing, LSI)方法对scATAC-seq数据进行降维。该步骤学习scRNA-seq数据的内部结构,并且在转换信息时对锚点恰当权重的决定很重要。
根据
Cusanovich et al, Science 2015
提出的LSI方法,他们搞了一个
RunLSI
函数。LSI的计算方法为TF-IDF加SVD。
我们使用在所有细胞中至少有100个read的peak,然后降维到50。该参数的选择受之前的scATAC-seq研究启发,所以没有更改,当然你你可以把它改了。
1 |
DefaultAssay(pbmc.atac) <- "ATAC" |
注 : 要将pbmc.atac的默认assay切换成”ATAC”, 非线性降维可以选择UMAP或者t-SNE。
我们之前使用过Seurat对scRNA-seq数据进行预处理和聚类,下载地址为 Dropbox 。
1 |
pbmc.rna <- readRDS("pbmc_10k_v3.rds") |
将scRNA-seq和scATAC-seq共同展示,对一些骨髓(myeloid)和淋巴(lymphoid)PBMC中比较常见的聚类,其实是能从图中看出来。
1 |
p1 <- DimPlot(pbmc.atac, reduction = "tsne") + |
现在,我们用
FindTransferAnchors
鉴定scATAC-seq数据集和scRNA-seq数据集的锚点,然后根据这些锚点将 10K scRNA-seq数据中鉴定的细胞类型标记转移到scATAC-seq细胞中。
1 |
transfer.anchors <- FindTransferAnchors(reference = pbmc.rna, |
Seurat比较的是scRNA-seq表达量矩阵和scATAC-seq中基因活跃度矩阵,利用CCA降维方法比较两者在scRNA-seq中的高变异基因的关系
为了转移细胞类群的编号,我们需要一组之前注释过的细胞类型,作为
TransferData
的 refdata 参数输入。
TransferData
本质上采用的是KNN算法,利用距离未知类型细胞的最近N个已知细胞所属的类型来定义该细胞。
weight.reduction
参数是用来选择设置权重的降维。
1 |
celltype.predictions <- TransferData(anchorset = transfer.anchors, |
我们可以检查每个细胞预测得分的分布情况,选择性的过滤哪些得分比较低的细胞。我们发现超过95%的细胞得分大于或等于0.5.
1 |
hist(pbmc.atac$prediction.score.max) |
1 |
table(pbmc.atac$prediction.score.max > 0.5) |
之后,我们就可以在UMAP上检查预测的细胞类型的分布,检查细胞类型在scRNA-seq和scATAC-seq中的相对位置
1 |
pbmc.atac.filtered <- subset(pbmc.atac, |
在转移细胞类型标记之后,我们就可以进行细胞特意水平上的下有分析。举个例子,我们可以去找一些某些细胞类型特异的增强子,寻找富集的motif。目前这些分析Seurat还不直接支持,还在调试中。
最后,如果你想将所有的细胞一同展示,可以将scRNA-seq和scATAC-seq数据嵌入到相同的低维空间。
我们使用之前的锚点从scATAC-seq细胞中推断RNA-seq的值,后续分析就相当于两个单细胞数据的分析流程。
注意: 这一步只是为了可视化,其实不做也行。
选择用于估计的基因,可以是高变动基因,也可以是所有基因。
1 |
# 只选择高变动的基因作为参考 |
之后利用
TransferData
推断scATAC-seq在这些基因中的可能值,输出结果就是ATAC细胞对应的scRNA-seq矩阵
1 |
imputation <- TransferData(anchorset = transfer.anchors, |
合并两个的结果,然后就是scRNA-seq的常规分析。
1 |
coembed <- merge(x = pbmc.rna, y = pbmc.atac) |
在t-SNE上绘制结果
1 |
p1 <- DimPlot(coembed, reduction="tsne", group.by = "tech") |
从上面的结果中,你可能会发现某些细胞只有在一类技术中存在。举个例子,从巨噬细胞(megakaryocytes)到成熟的血小板细胞(pletelet)由于没有细胞核,无法被scATAC-seq技术检测到。我们可以单独展示每个技术,进行检查
1 |
DimPlot(coembed, reduction="tsne", split.by = "tech", group.by = "celltype", label = TRUE, repel = TRUE) + NoLegend() |
此外,你还可以发现B细胞前体类型附近有一类细胞只由scATAC-seq的细胞构成。通过展示这些细胞在CellRanger分析结果提供的黑名单位置所占read数,可以推测出这类细胞可能是死细胞,或者是其他scRNA-seq无法检测的人为因素。
1 |
coembed$blacklist_region_fragments[is.na(coembed$blacklist_region_fragments)] <- 0 |
Seurat这种基于基因活跃度得分进行细胞类型预测,是否靠谱,开发者提供了如下几个证据
pbmc.atac$prediction.score.max
)高,意味着用scRNA-seq定义细胞类型比较可靠
有一天我的师弟提了一个需求:
对于ChIP的下游分析,我很喜欢DiffBind做差异分析然后用ChIPseeker做注释这一套流程(因为ChIPseeker的输入格式是GRange格式,而DiffBind的dba.report输出也恰好是GRange格式,两者可以无缝衔接)。我之前的套路,一直都是无脑输出所有的DiffBind结果,然后放入ChIPSeeker里面做注释,完了之后转成data.frame,然后对data.frame做subset,做后续的GO分析()。但今天突然想对ChIPseeker的注释结果直接做subset,然后分别对上下调的结果画plotAnnoPie等ChipSeeker内置的画图函数。但发现subset无法对ChipSeeker annotatePeak函数的输出结果做筛选。
当然,对于DiffBind的结果用subset,分别提取上下调,然后再注释也是可以的,不过这样感觉更麻烦。
面对需求,如果无法解决提出需求的人,那么就只能写代码实现这个需求了。于是经过一个下午的努力,我给ChIPseeker加上了subset的功能。
先来介绍下如何使用。我们需要用
devtools
安装最新的ChIPseeker
1 |
BiocManager::install("TxDb.Hsapiens.UCSC.hg19.knownGene") |
我们以测试数据集来演示
1 |
library(TxDb.Hsapiens.UCSC.hg19.knownGene) |
此时会输出peakAnno里的描述统计信息
1 |
Annotated peaks generated by ChIPseeker |
peakAnno可以直接用来画图
1 |
plotAnnoPie(peakAnno) |
假如你突发奇想,我能不能就看看某一条染色体的作图结果,或者对于MACS2的结果,想根据FDR筛选下peak,然后看下peak的变化。
在之前我们无法直接对peakAnno背后的
csAnno
对象进行操作,所以需要先对输入的GRanges进行过滤然后再用
annotatePeak
进行注释,然后画图。
但是现在我们有了
subset
, 这一切就变得稍微简单起来了
我们可以按照染色体编号进行筛选
1 |
peakAnno_subset <- subset(peakAnno, seqnames == "chr1") |
可以按照peak宽度进行筛选
1 |
peakAnno_subset <- subset(peakAnno, length > 500) |
如果筛选之后没有任何结果,那么就会报错
1 |
> subset(peakAnno, FDR... < .05) |
那么问题就是,这些筛选条件的名字怎么获知。
只要将peakAnno转成GRanges格式,所以可以看到的列都是你可以筛选的标准。
1 |
gr <- as.GRanges(peakAnno) |
给ChIPseeker增加subset的功能,应该是我第一次在GitHub进行pull requests操作。写这个函数,需要先去理解csAnno对象到底是什么,以及如何保证csAnno这个对象在操作前后不会发生变化。
其实这个函数挺简单的,就是下面几行
1 |
##' @importFrom S4Vectors subset |
因为有很多功能是ChIPseeker已经有了的,比如说
getGenomicAnnoStat
, 还有一些是S4Vectors和BiocGenerics包提供的,比如说subset, start和end。
我们用来练手的文章发表在 Nature Communication ,”High contiguity Arabidopsis thaliana genome assembly with a single nanopore flow cell”, 非常不要脸的说,这篇文章是我师爷实验室发的。
简单讲讲故事内容,就是他们实验室买了一台nanopore仪器,就是下面这台, 目前仪器价格国内是8K左右,当然测序的价格就另说了。如同买台PS4主机,还要买游戏,买个单反,你还得买镜头。仪器只是败家的开始!
他们认为三代测序目前有两大问题,测的还不够长以及不够准。nanopore解决了其中一个问题,不够长。 Arabidopsis thaliana 当年用一代测序,虽然可以认为是组装的金标准了,但是还是有很多区域是BAC连BAC文库搞不定的,所以就用这台仪器把 Arabidopsis thaliana 测了一波。显然就测一个nanopore,还是已知序列的物种是不可能发文章的,于是他们又用Pacbio sequel测了一波。最后用bionano 光学图谱验证了一次(请大家自行计算要多少钱)。
光测序不行,还得组装对吧。传统的组装方法是想办法利用高深度和随机错误进行纠错,然后用纠错后的长序列进行组装,最后用二代进行纠错。对于一台不错的服务器(20W起步吧)大约花个十天半个月就行。作者或许认为买一台20多w的外设配合不到1w的测序仪可能是太蠢了,于是他用了比较Li Heng大神开发的工具,Minimap+miniasm进行组装,然后用racon+pillon进行纠错,用了一台Macbook Pro 15.6寸花了4天就搞定了,并且和常规工具比较,还算过得去哦。
下面就是正式的分析:
根据文章提供的项目编号”PRJEB21270”, 在European Nucleotide Archive上找到下载地址。
进入这个页面之后,就可以去下载作者用到的所有数据,我们下载Sequel和MinIon和Illuminia的数据就好了,数据量加起来差不多30G。
1 |
## Sequal |
对于Illumina的二代测序,需要用prefetch进行下载
1 |
# Illuminia MiSeq |
拿到数据之后,我们就可以用作者提供的分析流程进行重复了。地址为 https://github.com/fbemm/onefc-oneasm/wiki/Assembly-Generation
这就是大神的自信,把代码都给你,反正你也看不懂。当然我在重复的时候用的都是最新的软件,所以会有所不同
第一步:拿着80%~90%正确率的原始数据相互比对, 找序列之间的Overlap。这一步,我花了30分钟
1 |
time ~/opt/biosoft/minimap2/minimap2 -t 10 -x ava-ont ont.fq ont.fq > gzip -1 ont.paf.gz & |
第二步:找到Overlap,就能够进行组装了。这一步我花了2分钟
1 |
time ~/opt/biosoft/miniasm/miniasm -f ont.fq ont.paf > ONTmin.gfa & |
第三步: 原始的组装结果充满了错误,所以需要进行纠错。纠错分为两种,一种是用三代自身数据,一种是用二代数据进行纠错。当然这两步都是需要的
首先使用三代数据进行纠错,古语有云“事不过三”一般迭代个三次就差不多。这三步,差不多用了1个小时。
1 |
# Iteration 1 |
之后使用二代数据进行纠错。二代数据虽然短,但是测序质量高,所以一般都要用它进行纠错。推荐用30X PCR free的illuminia 测序数据。
Step 1: 数据预处理,过滤低质量短读,去接头。工具很多,常用的是trimmomatic,cutadapter. 我安利一个国内海普洛斯搞的一个工具fastp。
1 |
# data clean |
这里标准为:平均质量高于Q30,对5‘端进行低质量碱基删除,保留大于100bp的短读
Step2: 比对,这一步基本都只用了bwa了
1 |
# align |
step3: 使用比对后的BAM文件进行纠错
1 |
# short read consensus call |
二代纠错的时间明显比之前的久,需要一天时间。
大家拿出自己的笔记本实际感受下呗
FALCON和Canu的组装后会得到一个单倍型融合的基因组,用来表示二倍体基因组。之后,FALCON Unzip和Supernova这类软件进一步处理其中等位基因区域,将这部分区间进行拆分。
当基因组某些区域可能有着比较高的杂合度,这会导致基因组该区域的两个单倍型被分别组装成primary contig, 而不是一个为primary contig, 另一个是associated haplotig. 如果下游分析主要关注于单倍型,这就会导致一些问题。
那么有没有解决方案呢?其实也很好办,就是找到相似度很高的contig,将他们拆分。目前已经有一些软件可以完成类似任务,如 HaploMerger2 , Redundans , 这不过这些软件主要处理二代组装结果。
purge_haplogs
则是最近开发,用于三代组装的基因组。它根据minimap2的比对结果,通过分析比对read的覆盖度决定谁去谁留。该工具适用于单倍型组装软件,例如 Canu, FALCON或 FALCON-Unzip primary contigs, 或者是分相后的二倍体组装(Falcon-Unzip primary contigs + haplotigs 。
它的工作流程如下图所示。一般只需要两个输入文件,组装草图(FASTA格式) 和 比对的BAM文件。同时还可以提供重复序列注释的BED文件,辅助处理高重复的contig。
建议 : 用原来用于组装的read进行比对。对于多个匹配的read,建议采取random best,也就是随便找一个。
purge_haplotigs
依赖软件比较多,手动安装会很麻烦,但是他可以直接用bioconda装
1 |
conda create -n purge_haplotigs_env |
安装完成后需要一步测试
1 |
purge_haplotigs test |
数据准备。 需要下载的数据集分为两个部分,一个是FALCON-Unzip后的primary contig 和 halplotigs. 另一个则是已经比完后的BAM文件
1 |
mkdir purge_haplotigs_tutorial |
当然我们不可能直接就拿到比对好的BAM文件,我们一般是有组装后的基因组以及用于组装的subread,假设这两个文件命名为, genome.fa 和 subreads.fasta.gz.
官方提供的新比对代码
1 |
minimap2 -t 4 -ax map-pb genome.fa subreads.fasta.gz --secondary=no \ |
如下是旧版代码
1 |
minimap2 -ax map-pb genome.fa subreads.fasta.gz \ |
如果你有二代测序数据,也可以用BWA-MEM进行比对得到BAM文件。
第一步:使用
purge_haplotigs readhist
从BAM中统计read深度,绘制柱状图。
1 |
# 新 |
也就是下图,你能明显的看到图中有两个峰,一个是单倍型的覆盖度,另一个二倍型的覆盖度,
你可能还想知道高纯合基因组是什么样的效果,我也找了一个纯合的物种做了也做了read-depth 柱状图,
之后你需要根据read-depth 柱状图 确定这两个峰的位置用于下一步。下面是两个例子。对于我们则是,20,65,190.
第二步: 根据read-depth信息选择阈值。
1 |
# 新 |
这一步生成的文件是”coverage_stats.csv”
第三步:区分haplotigs.
1 |
purge_haplotigs purge -g cns_p_ctg.fasta -c coverage_stats.csv -b cns_p_ctg.aligned.sd.bam -t 4 -a 60 |
这一步会得到如下文件
1 |
000004F,PRIMARY -> 000004F_013,HAPLOTIG |
在”curated.reassignments.tsv”文件中有6列
由于我们用的是单倍型组装primary contigs而不是二倍体组装的parimary + haplotigs, 因此我们需要将FALCON_Unzip的haplotgi合并到重新分配的haplotigs中,这样子我们依旧拥有二倍体组装结果
1 |
cat cns_h_ctg.fasta >> curated.haplotigs.fasta |
官方提供了5个可能出现的共线性图
第二种: 大部分是haplotigs , 说明这个contig部分是二倍型,部分是单倍型,可能是半合子(hemizygous)
第三种: Haplotigs里有大量的 串联重复
第四种: Haplotigs是 回文序列(palindrome)
第五种: contig从string graph中 knots 产生,这种情况不算是haplotigs,但是对于短读序列的比对会造成麻烦
你可能需要看大量的图才能有感觉,到底应该把哪些Purge_haplotigs错误认为是haplotig的contig放回到primary contig中。
分析流程的第二步的任务就是人工划分出如下图B部分,绿色的部分是坍缩单倍型contig,蓝色的部分是潜在的冗余contig。之后,分析流程会计算这些区域中的contig的覆盖度。 对于绿色部分中的contig,如果覆盖度低于80%, 会进行标记用于后续分析。如果深度非常低,那么很有可能就是组装引入错误,深度非常高的部分基本就是重复序列或者是细胞器的contig,这些黄色的contig可以在后续的组装出分开。
第三步就是同源序列进行识别和分配。所有标记的contig之后会用Minimap2在整个组装进行搜索,寻找相似度较高的离散区间(如下图C)。如果一个Contig的联配得分大于阈值(默认70%), 那么就会被标记为haplotigs. 如果一个contig的最大联配得分大于阈值(默认250%), 会被标记成重复序列,这有可能是潜在的有问题contig,或许是坍缩的contig或者低复杂度序列。
TransDecoder能够从转录本序列中鉴定候选编码区。这些转录本序列可以来自于Trinity的从头组装,或者来自于Cufflinks或者StringTie的组装结果。
从 https://github.com/TransDecoder/TransDecoder/releases 下载最新版的TransDecoder,以v5.5.0为例
1 |
mkdir -p ~/opt/biosoft && cd ~/opt/biosoft |
我们从cufflinks或stringtie输出的gtf文件开始分析流程,因此你会有两个输入文件
第一步 : 从GTF文件中提取FASTA序列
1 |
~/opt/biosoft/TransDecoder-v5.5.0/util/gtf_genome_to_cdna_fasta.pl transcripts.gtf genome.fasta > transcripts.fasta |
第二步 : 将GTF文件转成GFF3格式
1 |
~/opt/biosoft/TransDecoder-v5.5.0/util/gtf_to_alignment_gff3.pl transcripts.gtf > transcripts.gff3 |
第三步
: 预测转录本中长的开放阅读框, 默认是100个氨基酸,可以用
-m
修改
1 |
~/opt/biosoft/TransDecoder-v5.5.0/TransDecoder.LongOrfs -t transcripts.fasta |
第四步
: 使用DIAMOND对上一步输出的
transcripts.fasta.transdecoder.pep
在蛋白数据库中进行搜索,寻找同源证据支持
1 |
# 下载数据并解压缩 |
关于DIAMOND的使用,参考这篇说明 DIAMOND: 超快的蛋白序列比对软件
第五步 : 预测可能的编码区
1 |
~/opt/biosoft/TransDecoder-v5.5.0/TransDecoder.Predict \ |
第六步 : 生成基于参考基因组的编码区注释文件
1 |
~/opt/biosoft/TransDecoder-v5.5.0/util/cdna_alignment_orf_to_genome_orf.pl \ |
最终输出文件如下:
其中BED和GFF3可以放到IGV上展示,手动检查下结果
假如是Trinity从头预测的转录本,没有参考基因组,那么就运行第三步,第四步和第五步
在transcripts.fasta.transdecoder.cds文件中,每个fasta序列的头信息部分会有一个ORF type,分为如下几个类型
通常而言,我们会用complete的cds寻找同源证据,然后选择高可信度的序列用于训练,而不是哪些特别长且没有已知蛋白支持的序列。
今天用BLASTX将我的转录本序列在UniProt蛋白数据库(700w条序列)中搜索,80个线程,过了1小时大概就分析1000条吧。实在是有点慢,于是我想到之前耳闻的DIAMOND,据说速度非常快,于是我测试了下。没想到,这工具居然那么快。
根据DIAMOND介绍,它有以下特点
我就看中它一点,速度快。
软件安装异常的简单,因为提供了预编译的64位可执行文件
1 |
wget http://github.com/bbuchfink/diamond/releases/download/v0.9.25/diamond-linux64.tar.gz |
因为 diamon的功能就是将蛋白或者翻译后的核苷酸和蛋白数据库进行比对,没有BLAST那么多功能,所以软件使用也是异常的简单。
第一步: 先从NCBI上下载蛋白数据库。 NR库是NCBI的非冗余蛋白数据库,
1 |
wget ftp://ftp.ncbi.nlm.nih.gov/blast/db/FASTA/nr.gz |
也可以从 ftp://ftp.ncbi.nlm.nih.gov/refseq/release/plant/ 下载植物的蛋白数据库
第二步: 建库。就两个参数,
--in nr
输入文件,
--db nr
输出的数据库前缀. 氨基酸序列中的结尾可以有”*”
1 |
diamond makedb --in nr --db nr |
注
: 假如要根据GFF提取蛋白序列,一定要注意输出的氨基酸序列中不能有”.”在序列中,否则会报错。可以通过
seqkit grep -s -vrp '"\."' input.fa > output.fa
进行过滤。
第三步: 搜索。就两个子命令,blastp和blastx,前者比对蛋白,后者比对DNA序列
1 |
diamond blastx --db nr -q reads.fna -o dna_matches_fmt6.txt |
-q/--query
输入检索序列,
--out/-o
输出文件,默认以
--outfmt 6
输出结果和BLAST+的
--outfmt 6
结果一致。
注意事项:
--sensitive
或
--more-senstive
提高敏感度。
性能优化:
-e
参数
-k
参数,减少输出的联配数目。这会降低临时文件大小和最终结果
--top
会输出得分比最好的分数低一定百分比的结果,
--compress 1
: 输出结果会以gzip进行压缩
在基因组注释上,MAKER算是一个很强大的分析流程。能够识别重复序列,将EST和蛋白序列比对到基因组,进行从头预测,并在最后整合这三个结果保证结果的可靠性。此外,MAKER还可以不断训练,最初的输出结果可以继续用作输入训练基因预测的算法,从而获取更高质量的基因模型。
Maker的使用比较简单,在软件安装成后,会有一个”data”文件夹存放测试数据
1 |
ls ~/opt/biosoft/maker/data |
以”dpp”开头的数据集为例,protein表示是同源物种的蛋白序列,est是表达序列标签,存放的是片段化的cDNA序列,而contig则是需要被预测的基因组序列。
让我们新建一个文件夹,并将这些测试数据拷贝过来。
1 |
mkdir test01 ; cd test01 |
由于基因组注释设计到多个程序,多个步骤,每个步骤可能都有很多参数需要调整,因此就需要建立专门的配置文件用来告诉maker应该如何控制流程的运行。
如下步骤创建三个以ctl结尾的配置文件
1 |
~/opt/biosoft/maker/bin/maker -CTL |
maker_exe.ctl和maker_bopt.ctl可以简单用less查看,可不做修改,maker_opt.ctl是主要调整的对象。 使用
vim maker_opt.ctl
修改如下内容
1 |
genome=dpp_contig.fasta |
修改完之后多花几分钟看看每个参数的设置,尽管很枯燥,但是考虑这个工具你可能会反复多次使用,所以这点时间是一定要花的。
随后就可以在当前路径运行程序
1 |
~/opt/biosoft/maker/bin/maker &> maker.log & |
输出结果见”dpp_contig.maker.output”, 重点是”dpp_contig_master_datastore_index.log”文件,由于maker会拆分数据集并行计算,因此该文件记录总体的运行情况,需要关注其中是否有”FAILED”,”RETRY”,”SKIPPED_SAMLL”,”DIED_SIPPED_PERMANET”,因为这意味着有些数据出于某些原因没有运算。
最后,我们需要将并行运算的结果进行整合,导出GFF文件, 转录本序列和蛋白序列
1 |
~/opt/biosoft/maker/bin/fasta_merge -d dpp_contig_master_datastore_index.log |
在该目录下就会出现, “dpp_contig.all.gff”, “dpp_contig.all.maker.proteins.fasta”,”dpp_contig.all.maker.transcripts.fasta”
其中GFF文件就需要用IGV,JBrowse, Apollo下展示来检查下注释是否正确。
软件安装 :MAKER可以免费用于学术用途,但是未经许可不可商用。目前有两个版本2018年5月4日更新的2.31.10和测试版3.01.02.出于稳定性考虑,安装前者。后续假设已经在 http://yandell.topaz.genetics.utah.edu/cgi-bin/maker_license.cgi 进行登记,并且下载了压缩包”maker-2.31.10.tgz”
先检查下自己的系统情况,看需要补充哪些库
1 |
tar xf maker-2.31.10.tgz |
这一步之后会罗列出后续需要运行的命令来完成安装
1 |
./Build installdeps |
Canu是Celera的继任者,能用于组装PacBio和Nanopore两家公司得到的测序结果。
Canu分为三个步骤,纠错,修整和组装,每一步都差不多是如下几个步骤:
这三步可以分开运行,既可以用Canu纠错后结果作为其他组装软件的输入,也可以将其他软件的纠错结果作为Canu的输入,因此下面分别运行这三步,并介绍重要的参数。
几个全局参数:genomeSize设置预估的基因组大小,这用于让Canu估计测序深度; maxThreads设置运行的最大线程数;rawErrorRate用来设置两个未纠错read之间最大期望差异碱基数;correctedErrorRate则是设置纠错后read之间最大期望差异碱基数,这个参数需要在 组装 时多次调整;minReadLength表示只使用大于阈值的序列,minOverlapLength表示Overlap的最小长度。提高minReadLength可以提高运行速度,增加minOverlapLength可以降低假阳性的overlap。
数据来自于发表在 Nature Communication 的一篇文章 “ High contiguity Arabidopsis thaliana genome assembly with a single nanopore flow cell “。 这篇文章提供了 Arabidopsis thaliana KBS-Mac-74 的30X短片段文库二代测序、PacBio和Nanopore的三代测序以及Bionano测序数据, 由于拟南芥的基因组被认为是植物中的金标准,因此文章提供的数据适合非常适合用于练习。根据文章提供的项目编号”PRJEB21270”, 在European Nucleotide Archive上找到下载地址。
1 |
## PacBio Sequal |
下载的PacBio数据以BAM格式存储,可以通过安装PacBio的smrtlink工具套装,使用其中的bam2fasta工具进行转换.
1 |
# build index for convert |
其实
samtools fasta
也可以将bam转成fasta文件,并且不影响之后的组装。
PacBio的smrtlink工具套装大小为1.4G,不但下载速度慢,安装也要手动确认各种我不清楚的选项, 唯一好处就是工具很全。
第一步 :纠错。三代测序本身错误率高,使得原始数据充满了噪音。这一步就是通过序列之间的相互比较纠错得到高可信度的碱基。主要调整两个参数
1 |
canu -correct \ |
可以将上述命令保存到shell脚本中进行运行,
nohup bash run_canu.sh 2> correct.log &
.
注: 1.7版本里会没有默认没有安装gnuplot出错,因此gnuplotTested=true 可以跳过检查。
第二步 :修整。这一步的目的是为了获取更高质量的序列,移除可疑区域(如残留的SMRTbell接头).
1 |
canu -trim \ |
第三步 : 组装。在前两步获得高质量的序列后,就可以正式进行组装. 这一步主要调整的就是纠错后的序列的错误率, correctedErrorRate,它会影响utgOvlErrorRate。这一步可以尝试多个参数,因为速度比较块。
1 |
# error rate 0.035 |
最后输出文件下的
ath.contigs.fasta
就是结果文件。
对于Nanopore数据,使用Canu组装并不是一个非常好的选择,我曾经以一个600多M的物种100X数据进行组装,在120线程,花了整整一个多月的时间,尽管它的组装效果真的是很好。
-fast
: 对于1Gb以下的物种,可以加上该参数,会明显提高速度
对于高杂合物种的组装,Canu建议是用
batOptions=-dg 3 -db 3 -dr 1 -ca 500 -cp 50
参数尽量分出两套单倍型,然后对基因组去冗余。
batOptions
表示传递后续的参数给组装软件
bogart
,
-dg 3 -db3
降低自动确定阈值时的错误率离差(deviation),从而更好的分开单倍型。
-dr 1 -ca 500 -cp 50
会影响错误组装的拆分,对于一个模棱两可的contig,如果至少另一条可选路径的overlap长度至少时500bp,或者说另一条可选路径时在长度上和当前最佳路径存在50%的差异,那么就将contig进行拆分。
关于杂合物种组装的讨论,参考 https://github.com/marbl/canu/issues/201#issuecomment-233750764
如果你的服务器线程数很多,你在普通的机械硬盘上运行组装,而且你的系统还是CentOS,那么你需要调整一个参数,避免其中一步的IO严重影响服务器性能。
Canu通过两个策略进行并行,bucketizing (‘ovb’ 任务) 和 sorting (‘ovs’ 任务)。 bucketizing会从1-overlap读取输出的overlap,将他们 复制 一份作为中间文件。sorting一步将这些文件加载到内存中进行排序然后 写出 到硬盘上。 如果你的overlap输出特别多,那么该步骤将会瞬间挤爆的你的IO.
为了避免悲剧发生,请增加如下参数:
ovsMemory=16G ovbConcurrency=15 ovsConcurrency=15
, 也就是降低这两步同时投递的任务数,缓解IO压力。
overlap这一步时间久,如果并没有服务器集群,而是有多台服务器,可以参考如下方法进行数据并行处理(必须要安装相同的Canu版本)
假如Canu任务中的prefix参数为coc, 用scp进行数据的传递
1 |
scp -r coc.seqStore wangjw@10.10.87.132:/data1/wjw/Coc/Canu |
到目标服务器的canu目录下
1 |
mkdir unitigging |
修改
overlap.sh
里的bin路径,指定当前服务器的canu路径
之后运行任务即可
1 |
cd unitigging/1-overlapper/ |
运行完任务之后,将目前服务器
unitigging/1-overlapper/001
目录下的
000077.oc 000077.ovb 000077.stats
文件传送回原来的服务器
unitigging/1-overlapper/001
下即可。