文章首發在個人博客: NECAT: Nanopore數據的高效組裝工具
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® Xeon® CPU E5-2640 v4 @ 2.40GHz),下面是正文。
軟件安裝
NECAT可以在https://github.com/xiaochuanle/NECAT/releases/頁面獲取最新的軟件下載地址,這裏下載的是0.01版本。
wget https://github.com/xiaochuanle/NECAT/releases/download/v0.01/necat_20190307_linux_amd64.tar.gz
tar xzvf necat_20190307_linux_amd64.tar.gz
export PATH=$PATH:$(pwd)/NECAT/Linux-amd64/bin
目前0.01版本不支持gz文件作爲輸入,但後續版本應該會支持。
實戰
第一步: 新建一個分析項目
mkdir NECAT && cd NECAT
以發表在NC上的擬南芥數據爲例, 下載該數據
# 三代測序
wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR217/003/ERR2173373/ERR2173373.fastq.gz
seqkit seqkit fq2fa ERR2173373.fastq.gz | gzip -c > ERR2173373.fasta
第二步: 創建配置文件
necat.pl config ath_config.txt
配置文件中,主要修改如下幾個參數
PROJECT=athaliana #項目名
ONT_READ_LIST=read_list.txt #read所在路徑文件
GENOME_SIZE=120000000 #基因組大小
THREADS=20 # 線程數
MIN_READ_LENGTH=3000 # 最短的read長度
CNS_OUTPUT_COVERAGE=45 # 用於組裝的深度
參數中還有一個,NUM_ITER=2,它並非是簡單的重複2次糾錯,它的每一輪的校正目的其實不同,第一輪的優先級是敏感度(senstitive), 第二輪之後主要追求速度(fast)。
除了上面的配置參數外,其他參數可以不需要修改,使用默認的值即可。需要修改的話,參考最後的參數說明部分。
第三步: 序列糾錯
necat.pl correct ath_config.txt &
糾錯後的reads在athaliana/1-consensus/cns_final.fasta
cns_finla.fasta
的統計信息會輸出在屏幕中, 或者自己用fsa_rd_stat
也能得到同樣的結果
Count: 206342
Tatal: 3102480870
Max: 112992
Min: 1010
N25: 31940
L25: 18989
N50: 21879
L50: 48506
N75: 13444
L75: 93215
此外我還用time獲取了運行時間,糾錯花了大概一個小時。
real 55m31.451s
user 815m32.801s
sys 7m55.039s
第四步: contig組裝
necat.pl assemble ath_config.txt &
結果在athaliana/4-fsa/contigs.fasta
關於contigs.fata
統計信息會輸出在屏幕上,同樣用fsa_rd_stat
也可以。
Count: 162
Tatal: 122293198
Max: 14562810
Min: 1214
N25: 13052494
L25: 3
N50: 9503368
L50: 5
N75: 4919866
L75: 10
時間用了75分鐘
real 74m53.127s
user 1308m29.534s
sys 12m5.032s
第五步: contig搭橋
necat.pl bridge ath_config.txt
結果在athaliana/6-bridge_contigs/bridged_contigs.fasta
Count: 127
Tatal: 121978724
Max: 14562810
Min: 2217
N25: 13193939
L25: 3
N50: 11146374
L50: 5
N75: 5690371
L75: 9
從N50和N75可以看出這一步會提高組裝的連續性。
組裝結果polish
對Nanopore組裝結果進行polish的常用軟件有下面3個
由於擬南芥的基因組比較小,我分別用了Medaka和racon對輸出結果進行polish(因爲沒有原始信號數據,因此nanopolish用不了),代碼如下
Medaka
NPROC=20
BASECALLS=ERR2173373.fasta
DRAFT=athaliana/6-bridge_contigs/bridged_contigs.fasta
OUTDIR=medaka_consensus
medaka_consensus -i ${BASECALLS} -d ${DRAFT} -o ${OUTDIR} -t ${NPROC} -m r941_min_high
三輪Racon:
gzip -dc ERR2173373.fastq.gz > ERR2173373.fastq
minimap2 -t 20 ${DRAFT} ERR2173373.fastq > round_1.paf
racon -t 20 ERR2173373.fastq round_1.paf ${DRAFT} > racon_round1.fasta
minimap2 -t 20 racon_round1.fasta ERR2173373.fastq > round_2.paf
racon -t 20 ERR2173373.fastq round_2.paf racon_round1.fasta> racon_round2.fasta
minimap2 -t 20 racon_round2.fasta ERR2173373.fastq > round_3.paf
racon -t 20 ERR2173373.fastq round_3.paf racon_round2.fasta> racon_round3.fasta
在後續評估質量的時候,我發現單純用三代polish的結果還不是很好,因此我用他們提供的二代測序,用NextPolish對NECAT的結果進行polish。
# 二代測序
prefetch ERR2173372
fasterq-dump -O . ERR2173372
run.cfg內容如下, 其中sgs.fofn記錄的就是解壓後的ERR2173372_1.fastq和ERR2173372_2.fastq的路徑
[General]
job_type = local
job_prefix = nextPolish
task = 1212
rewrite = no
rerun = 3
parallel_jobs = 8
multithread_jobs = 20
genome = input.fasta
genome_size = auto
workdir = ./nextpolish
polish_options = -p {multithread_jobs}
[sgs_option]
sgs_fofn = ./sgs.fofn
sgs_options = -max_depth 100 -bwa
我考慮了兩種情況,一種是直接用二代polish,另一種是三代polish之後接二代polish。
結果評估
在計算時間上,我之前用Canu跑了相同的數據,設置原始錯誤率0.5,糾錯後錯誤率爲0.144,用3個節點(每個節點12個線程),運行了3天時間,但是NECAT只需要3個小時左右就能完成相同的分析,這個速度差異實在是太明顯了。
用Minimap2 + dotPlotly繪製CANU,NECAT和擬南芥參考基因組的共線性圖
minimap2 -t 20 -x asm5 Athaliana.fa NECAT.fa > NECAT.paf
pafCoordsDotPlotly.R -i NECAT.paf -o NECAT -l -p 10 -k 5
minimap2 -t 20 -x asm5 Athaliana.fa CANU.fa > CANU.paf
pafCoordsDotPlotly.R -i CANU.paf -o CANU -l -p 10 -k 5
NECAT的結果
CANU的結果
NECAT和CANU都和參考基因組有着良好的共線性,但是NECAT的連續性更好,幾乎成一條直線。
之後,我使用了QUAST來評估Canu,NECAT初步組裝,NECAT用Medaka, nanopolish和racon糾錯的結果(MD: MEDAKA, RC: RACON, NP:NextPolish)。
quast.py -t 100 --output-dir athaliana --circos \
CANU.fa \
NECAT.fa \
NECAT_MD.fa \
NECAT_MD_NP.fa \
NECAT_NP.fa \
NECAT_RC.fa \
NECAT_RC_NP.fa \
-r Athaliana.fa \
-g TAIR10_GFF3_genes.gff &
一些描述基本信息
CANU N50 = 4875070, L50 = 7, Total length = 114689024, GC % = 36.09
NECAT N50 = 11146374, L50 = 5, Total length = 121978724, GC % = 36.50
NECAT_MD N50 = 11216803, L50 = 5, Total length = 122101599, GC % = 36.54
NECAT_MD_NP N50 = 11405151, L50 = 5, Total length = 124142955, GC % = 36.30
NECAT_NP N50 = 11399084, L50 = 5, Total length = 124735066, GC % = 36.36
NECAT_RC N50 = 11212098, L50 = 5, Total length = 122519370, GC % = 36.4
NECAT_RC_NP N50 = 11406553, L50 = 5, Total length = 124618502, GC % = 36.34
在BUSCO完整度上, 以embryophyta_odb10作爲物種數據庫, 其中ONTmin_IT4是發表的文章裏的結果, Athalina則是擬南芥的參考基因組,我們以它們的BUSCO值作爲參照。
Athalina : C:98.6%[S:98.0%,D:0.6%],F:0.4%, M:1.0%, n:1375
ONTmin_IT4 : C:98.4%[S:97.7%,D:0.7%],F:0.7%, M:0.9%, n:1375
CANU : C:22.9%[S:22.8%,D:0.1%],F:20.2%,M:56.9%,n:1375
NECAT : C:36.6%[S:36.6%,D:0.0%],F:22.9%,M:40.5%,n:1375
NECAT_MEDAKA : C:53.6%[S:53.2%,D:0.4%],F:21.0%,M:25.4%,n:1375
NECAT_RACON : C:45.3%[S:45.2%,D:0.1%],F:23.1%,M:31.6%,n:1375
二代Polish後的BUSCO結果如下(MD: MEDAKA, RC: RACON, NP:NextPolish):
Athalina : C:98.6%[S:98.0%,D:0.6%],F:0.4%,M:1.0%,n:1375
ONTmin_IT4 : C:98.4%[S:97.7%,D:0.7%],F:0.7%,M:0.9%,n:1375
NECAT_NP : C:98.6%[S:97.9%,D:0.7%],F:0.4%,M:1.0%,n:1375
NECAT_MD_NP: C:98.7%[S:98.0%,D:0.7%],F:0.4%,M:0.9%,n:1375
NECAT_RC_NP: C:98.5%[S:97.8%,D:0.7%],F:0.4%,M:1.1%,n:1375
從以上這些數據,你可以得到以下幾個洞見:
- 在Nanopore的組裝上,NECAT效果優於Canu,無論是連續性還是N50上
- MEDAKA三代polish效果好於RACON。在速度上,MEDAKA比三遍RACON都慢,並且MEDAKA會將一些可能的錯誤組裝給打斷
- Nanopore的數據用NECAT組裝後似乎用NextPolish進行polish後就行,但是由於物種比較小,可能不具有代表性。
結論: Nanopore的組裝建議用NECAT。組裝之後是先用MEDAKA做一遍三代polish,然後用NextPolish默認參數做二代polish。
配置文件補充
這部分對配置文件做一點簡單補充。
下面這些參數相對簡單,不需要過多解釋,按照自己需求修改
- CLEANUP: 運行完是否清理臨時文件,默認是0,表示不清理
- USE_GRID: 是否使用多節點, 默認是false
- GRID_NODE: 使用多少個節點,默認是0,當USE_GRID爲true時,按照自己實際情況設置
以下的參數則是需要根據到具體的軟件中去查看具體含義,需要和軟件開發者討論
- OVLP_FAST_OPTIONS: 第二輪糾錯時, 傳給
c2pmov
- OVLP_SENSITIVE_OPTIONS: 第一輪糾錯時, 傳給
c2pmov
- CNS_FAST_OPTIONS: 第二輪糾錯時,傳給
oc2cns
- CNS_SENSITIVE_OPTIONS: 第一輪糾錯時,傳給
oc2cns
- TRIM_OVLP_OPTIONS: 傳給
oc2asmpm
- ASM_OVLP_OPTIONS: 傳給
oc2asmpm
- FSA_OL_FILTER_OPTIONS: 參數傳給
fsa_ol_filter
- FSA_ASSEMBLE_OPTIONS: 參數傳給
fsa_assemble
- FSA_CTG_BRIDGE_OPTIONS: 參數傳給
fsa_ctg_bridge
參考資料
- https://github.com/xiaochuanle/NECAT
版權聲明:本博客所有文章除特別聲明外,均採用 知識共享署名-非商業性使用-禁止演繹 4.0 國際許可協議 (CC BY-NC-ND 4.0) 進行許可。