使用nextpolish對三代組裝進行polish(v1.2.2版)

NextPolish是武漢未來組開發的一個三代基因組polish工具(另外一個常用軟件是Pilon)。NextPolish可以使用二代短讀序列或者三代序列或者兩者結合去糾正三代長讀長序列在組裝時導致的鹼基錯誤(SNV/Indel)。由於它是專爲polish設計,因此在運行速度和內存使用上都優與Pilon。

軟件安裝

目前NextPolish已經支持Python2/3,推薦使用Python2.7。NextPolish運行依賴Python的兩個模塊,分別是psutildrmaa,其中只有psutil纔是必須的,drmaa僅在你需要投遞任務時纔是必須的。

確認我們的Python版本, 以及檢查是否安裝了所需要的Python模塊

python -V
# Python 2.7.15
python -c "import psutil"
python -c "import drmaa"

之後到https://github.com/Nextomics/NextPolish/releases找最新的版本進行安裝,寫這篇時已經更新到1.2.2。

mkdir -p ~/opt/biosoft
cd ~/opt/biosoft
wget https://github.com/Nextomics/NextPolish/releases/download/v1.2.2/NextPolish.tgz
tar -zxvf NextPolish.tgz
# 編譯軟件
cd NextPolish && make -j 10
# 加入到.bashrc或.zshrc
export PATH=~/opt/biosoft/NextPolish:$PATH

軟件使用

注意:如果你的基因組用的是miniasm這類缺少consensus步驟的組裝軟件,那麼你需要運行racon利用三代序列進行polish。否則,由於基因組上存在過高的錯誤率,導致二代序列錯誤比對,影響polish效果。

threads=20
genome=input.genome.fa # 組裝的基因組
lgsreads=input.lgs.reads.fq.gz # 三代長度序列
# 將三代回帖到參考基因組
minimap2 -a -t ${threads} -x map-ont/map-pb ${genome} ${lgsreads}| \
    samtools view -F 0x4 -b - | \
    samtools sort - -m 2g -@ ${threads} -o genome.lgs.bam
#建立索引
samtools index -@ ${threads} genome.lgs.bam
samtools faidx ${genome}
# 使用nextPolish.py 進行polish
python ~/opt/biosoft/NextPolish/lib/nextPolish.py \
    -g ${genome} -t 5 --bam_lgs genome.lgs.bam -p ${threads} > genome.lgspolish.fa

目前NextPolish也支持根據三代序列進行polish,用於替代Racon,腳本如下

threads=20
genome=input.genome.fa # 組裝的基因組
lgsreads=input.lgs.reads.fq.gz # 三代長度序列
minimap2 -ax map-pb -t ${threads} ${genome} ${lgsreads} |samtools sort - -m 2g --threads 20 -o genome.lgs.bam
samtools index genome.lgs.bam
ls `pwd`/genome.lgs.bam > pb.map.bam.fofn
python NextPolish/lib/nextpolish2.py -g ${genome} -l pb.map.bam.fofn -r clr -p 20 -a -s -o genome.lgspolish.fa

生成的genome.lgspolish.fa就能用於後續的二代polish步驟。

NextPolish要求我們準備兩個文件:

  • run.cfg: 配置文件,設置各項參數
  • sgs.fofn: 二代測序文件的位置信息

使用NextDenovo組裝Nanopore數據文章組裝的結果爲例進行介紹。在分析目錄下有三個文件。

  • 三代組裝結果: nextgraph.assembly.contig.fasta
  • 二代序列: ERR2173372_1.fastq,ERR2173372_2.fastq

第一步:創建一個文件,用於記錄二代序列的位置信息

realpath ERR2173372_1.fastq ERR2173372_2.fastq  > sgs.fofn

第二步:配置run.cfg文件

# 從NextPolish目錄下複製配置文件
cp ~/opt/biosoft/NextPolish/doc/run.cfg run2.cfg

修改配置文件

[General]
job_type = local
job_prefix = nextPolish
task = default
rewrite = 1212
rerun = 3
parallel_jobs = 2
multithread_jobs = 10
genome = ./nextgraph.assembly.contig.fasta
genome_size = auto
workdir = ./01_rundir
polish_options = -p {multithread_jobs}

[sgs_option]
sgs_fofn = ./sgs.fofn
sgs_options = -max_depth 100

其中需要修改的參數爲,其餘參數查看官方的參數配置說明:

  • job_type: 任務類型,local表示單個節點運行。由於NextPolish使用DRMAA進行任務投遞,因此還支持,SGE, PBS和SLURM
  • task: 任務類型, 用12,1212,121212,12121212來設置polish的輪數,建議迭代2輪就可以了。
  • parallel_jobsmultithread_jobs表示同時投遞的任務數和每個任務的線程數,此處2 X 10=20
  • genome: 表示組裝基因組的位置
  • workdir: 輸出文件所在目錄
  • sgs_options: 該選項設置二代測序polish的參數,包括-use_duplicate_reads, -unpaired, -max_depth, -bwa, -minimap2(默認使用)

運行方法

nextPolish run2.cfg &

在最後輸出日誌中,會提示最終存放的文件在什麼位置,然後將這些文件合併到單個文件即可。

除了本地任務投遞以外,NextPolish還支持使用DRAMAA進行任務投遞,只需要修改job_typecluster_options這兩項即可。例如SGE的配置方法爲

# SGE
job_type=sge
cluster_options = -l vf={vf} -q all.q -pe smp {cpu} -S {bash} -w n

其中{vf}, {cpu}, {bash}會被NextPolish根據實際情況進行替換。不同的任務投遞系統的投遞參數也不同,需要根據實際情況進行調整。

如果之前的python -c "import drmaa"遇到如下的報錯

RuntimeError: Could not find drmaa library.  Please specify its full path using the environment variable DRMAA_LIBRARY_PATH

則需要設置DRMAA_LIBRARY_PATH的環境變量指定libdrmaa.so.1文件所在的位置

export DRMAA_LIBRARY_PATH=/path/to/libdrmaa.so.1

對於單節點服務器而言,使用nextPolish進行任務投遞並不是最佳選擇,因爲它會先將Fastq文件拆分成多份,然後短讀處理這些文件,其中的數據拆分步驟就會浪費一些時間。我們可以自己寫一個腳本,直接調用bwa/minimap2進行比對,然後再調用實際處理數據的腳本進行分析。

#!/usr/bin/bash

genome=$1
lgsreads=$2
read1=$3
read2=$4
threads=100

NextPolish=/opt/biosoft/NextPolish-1.2.2
#確保環境有samtools, bwa, minimap2
#module load samtools/1.10
#module load bwa/0.7.17

minimap2 -ax map-pb -t ${threads} ${genome} ${lgsreads} | samtools sort - -m 2g --threads 20 -o genome.lgs.bam
samtools index genome.lgs.bam
ls `pwd`/genome.lgs.bam > pb.map.bam.fofn
python $NextPolish/lib/nextpolish2.py -g ${genome} -l pb.map.bam.fofn -r clr -p ${threads} -a -s -o genome.lgspolish.fa

#Set input and parameters
round=2
input=genome.lgspolish.fa
for ((i=1; i<=${round};i++)); do
#step 1:
        #index the genome file and do alignment
        bwa index ${input};
        bwa mem -t ${threads} ${input} ${read1} ${read2} | samtools view --threads 10 -F 0x4 -b - | samtools sort - -m 2g --threads 20 -o sgs.sort.bam;
        #index bam and genome files
        samtools index -@ 20 sgs.sort.bam;
        samtools faidx ${input};
        #polish genome file
        python $NextPolish/lib/nextpolish1.py -g ${input} -t 1 -p ${threads} -s sgs.sort.bam > genome.polishtemp.fa;
        input=genome.polishtemp.fa;
#step2:
        #index genome file and do alignment
        bwa index ${input};
        bwa mem -t ${threads} ${input} ${read1} ${read2} | samtools view --threads 10 -F 0x4 -b - |samtools sort - -m 2g --threads 20 -o sgs.sort.bam;
        #index bam and genome files
        samtools index -@ 20 sgs.sort.bam;
        samtools faidx ${input};
        #polish genome file
        python $NextPolish/lib/nextpolish1.py -g ${input} -t 2 -p ${threads} -s sgs.sort.bam > genome.nextpolish.fa;
        input=genome.nextpolish.fa;
done;
#Finally polished genome file: genome.nextpolish.fa
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章