本次分析使用到的數(shù)據(jù)及數(shù)據(jù)處理流程參考文獻“https://doi.org/10.1186/s13756-018-0352-y ”??紤]到時間及存儲有限,且此次分析的目的僅為跑pipeline,因此本次測試僅用了ERP020566 中的小部分數(shù)據(jù),見ERR.list。
整個數(shù)據(jù)處理過程包括如下步驟:
- 數(shù)據(jù)下載及轉(zhuǎn)化:包括NCBI下載sra數(shù)據(jù)以及候選的參考基因組數(shù)據(jù);數(shù)據(jù)預(yù)處理
- 參考基因組選擇
- call SNP
- 構(gòu)建系統(tǒng)發(fā)育樹
吐槽文章的一個錯誤。文章中call snp后是把基因組中的噬菌體序列及重復(fù)序列區(qū)域去掉的(After excluding repetitive regions and mobile genetic elements, 159,154 SNP positions (length of the reference genome: 5,306,618 bp) ),而在圖注中標(biāo)明159,154 SNP 構(gòu)建的該菌核心基因組系統(tǒng)發(fā)育樹(The image shows a ML tree based on 159.154 SNPs of the core genome. A K. variicola isolate )。這個說法是有問題的,在查閱資料后,使用了一套新的方法構(gòu)建核心基因組snp系統(tǒng)發(fā)育樹,新方法會另寫文章。
1. 數(shù)據(jù)下載及預(yù)處理
下載數(shù)據(jù)并轉(zhuǎn)化為fastq格式:
#測試數(shù)據(jù)sra號
$ cat ERR.list
ERR1761568
ERR1761567
ERR1761566
ERR1761565
ERR1761564
ERR1761563
ERR1761562
ERR1761561
$ cat ERR.list | while read a;do echo "wget -c -nd -r -np -k -L -p -nd ftp://ftp.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByRun/sra/ERR/${a:0:6}/$a/${a}.sra";done >run.down.sh
$ cat ERR.list | while read a;do echo "fastq-dump --split-3 ${a}.sra";done >run.fastqdump.sh
數(shù)據(jù)過濾:
$ cat ERR.list | while read a;do echo "trimmomatic PE -threads 4 ${a}_1.fastq ${a}_2.fastq ${a}_R1.PE.fastq ${a}_R1.SE.fastq ${a}_R2.PE.fastq ${a}_R2.SE.fastq SLIDINGWINDOW:4:15 LEADING:3 TRAILING:3 MINLEN:36 &>${a}.log";done >run.trim.sh
在NCBI上下載多個候選參考基因組數(shù)據(jù):
#僅下載部分基因組數(shù)據(jù)
$ cat genome.list
Klebsiella_pneumoniae_KCTC_2242 ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/220/485/GCF_000220485.1_ASM22048v1
Klebsiella_pneumoniae_ATCC_BAA-2146 ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/364/385/GCF_000364385.3_ASM36438v3
Klebsiella_pneumoniae_500_1420 ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/406/765/GCF_000406765.2_ASM40676v2
Klebsiella_pneumoniae_UHKPC33 ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/417/085/GCF_000417085.2_ASM41708v2
Klebsiella_pneumoniae_DMC1097 ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/417/225/GCF_000417225.2_ASM41722v2
Klebsiella_pneumoniae_UHKPC07 ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/417/265/GCF_000417265.2_ASM41726v2
Klebsiella_pneumoniae_JM45 ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/445/405/GCF_000445405.1_ASM44540v1
Klebsiella_pneumoniae_KP-1 ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/465/975/GCF_000465975.2_ASM46597v2
Klebsiella_pneumoniae_CG43 ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/474/015/GCF_000474015.1_ASM47401v1
Klebsiella_pneumoniae_PMK1 ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/764/615/GCF_000764615.1_ASM76461v1
$ cat genome.list | while read a b;do echo "wget -c -r -nd -np -k -L -A fna.gz -P ${a} $b &>>down.log";done >run.down.sh
選擇候選的參考基因組時需注意盡量選擇組裝完整的基因組,同時獲得數(shù)據(jù)以后從基因組中去除質(zhì)粒序列,例如:
$ count.pl --pat NC_022082.1 Klebsiella_pneumoniae_JM45.fna >tmp && mv tmp Klebsiella_pneumoniae_JM45.fna
同時下載了ERR1761507作為后續(xù)建樹的外群,對于該數(shù)據(jù)的分析同上。
2. 參考基因組選擇
$ refrank.py -f *PE.fastq -r *fna -t 10 &>refrank.log &
#只是為了跑個pipeline,所以只用了一個數(shù)據(jù)做測試
$ refrank.py -f ERR176156[78]* -r *fna -t 10 &>refrank.log &
得到一個refRanking.txt文件,這個文件里面有軟件找出的參考基因組信息。
我僅用了部分SRA以及部分后續(xù)參考基因組,軟件跑出來的結(jié)果是Klebsiella pneumoniae UHKPC33,就用該基因組作為后續(xù)分析的參考基因組了。
3. call SNP
使用文章中的流程call snp (Varscan + snpfilter.py)。
#以ERR1761561樣本為例:
#建索引,生成mpileup文件
$ bwa index -p ref Klebsiella_pneumoniae_UHKPC33.fna &>/dev/null &
$ bwa mem -t 6 ref ERR1761561_R1.PE.fastq ERR1761561_R2.PE.fastq 2>/dev/null | samtools view -b -@ 4 -F 4 - | samtools sort -@ 4 - | samtools mpileup -q 1 -f Klebsiella_pneumoniae_UHKPC33.fna - >ERR1761561.mpileup 2>ERR1761561.log &
#VarScan軟件call snp
$ java -jar /public/software/varscan/VarScan.v2.4.3.jar mpileup2snp ERR1761561.mpileup --output-vcf 1 >ERR1761561.snp.vcf 2>ERR1761561.log &
#基于參考序列生成含有snp的序列文件
$ perl chg.pl Klebsiella_pneumoniae_UHKPC33.fna ERR1761561.snp.vcf >Klebsiella_pneumoniae_UHKPC33.snp.fna
#過濾snp
$ snpfilter.py Klebsiella_pneumoniae_UHKPC33.fna Klebsiella_pneumoniae_UHKPC33.snp.fna
# 批處理
$ cat ERR.list | while read a;do echo "bwa mem -t 6 ref ${a}_R1.PE.fastq ${a}_R2.PE.fastq 2>/dev/null | samtools view -b -@ 4 -F 4 - | samtools sort -@ 4 - | samtools mpileup -q 1 -f Klebsiella_pneumoniae_UHKPC33.fna - >${a}.mpileup 2>/dev/null && java -jar /public/software/varscan/VarScan.v2.4.3.jar mpileup2snp ${a}.mpileup --output-vcf 1>${a}.snp.vcf 2>/dev/null";done >run.sh
$ cat ERR.list | while read a;do perl chg.pl Klebsiella_pneumoniae_UHKPC33.fna ${a}.snp.vcf >>all.snp.fa;done
#過濾snp,去gap、ambiguous base以及基因組中的重復(fù)區(qū)域和前噬菌體序列等。做這步分析之前需要使用phaster在線工具注釋基因組中的噬菌體序列,并使用ICEberg下的ICEfinder在線工具注釋細菌基因組中的整合子結(jié)合元件等
$ snpfilter.py Klebsiella_pneumoniae_UHKPC33.fna all.snp.fa --mask region.txt
使用phaster在線工具過濾噬菌體序列。phaster在線注釋出參考基因組中的噬菌體區(qū)域:
460061 490463
1724712 1733196
2918297 2978044
3294633 3340680
3480582 3519282
3955718 4006647
4213795 4235686
4696467 4709499
使用ICEfinder在線工具注釋細菌基因組的整合子結(jié)合元件(integrative and conjugative elements):
# Name Location Length/bp Type
1 Region1 740482..796624 56143 Putative ICE with T4SS
2 Region2 1792161..1819646 27486 Putative IME
最后將phaster和ICEfinder的結(jié)果手動合并成一個文本文件,這里命名為region.txt。該文件包括兩列,第一列為起始位點,第二列為終止位點,中間以制表符分割。
460061 490463
740482 796624
1724712 1733196
1792161 1819646
2918297 2978044
3294633 3340680
3480582 3519282
3955718 4006647
4213795 4235686
4696467 4709499
snpfilter.py處理結(jié)果會生成fa文件,即過濾后并串聯(lián)后的序列,可以用于下游分析建樹。將生成的snp串聯(lián)后的fa文件重命名為SNPFILTER.fa
吐槽一下,VarScan和snpfilter.py兩個軟件的說明文檔寫的真心差,有些地方靠猜。vcf格式需要轉(zhuǎn)化成帶有snp的序列文件這一點文章和說明文檔里面都沒有,完全是多次試驗自己猜出來的。
chg.pl自己寫的,腳本如下:
#!/usr/bin/perl -w
use strict;
open FA,"$ARGV[0]";
open SNP,"$ARGV[1]";
my $file = "$ARGV[1]";
$file =~ s/\.snp\.vcf//;
my $seq;
while(<FA>){
unless(/^>/){
chomp;
$seq .= $_;
}
}
while(<SNP>){
unless(/^#/){
chomp;
my @F = split /\t/,$_;
my $snp = $F[4];
my $locate = $F[1];
substr($seq,$F[1]-1,1) = $snp;
}
}
print ">$file\n$seq\n";
這個方法call snp不算完美,更棒的教程可參考Cosmika Goswami和Umer Zeeshan Ijaz 的call snp流程**
流程具體鏈接見“http://userweb.eng.gla.ac.uk/cosmika.goswami/snp_calling/SNPCalling.html”
4.構(gòu)建系統(tǒng)發(fā)育樹
#可以使用一下流程。但是測試的時候用的服務(wù)器內(nèi)存有限,muscle這一步太吃內(nèi)存了,改用了耗內(nèi)存更小的mafft。
$ muscle -in SNPFILTER.fa -out SNPFILTER.aln && \
BeforePhylo.pl -type=dna -trim -conc=raxml -output=phylip SNPFILTER.aln && \
mv output.phy SNPFILTER.phy && \
raxmlHPC -T 6 -f a -x 12345 -p 12345 -# 1000 -m GAMMA -s SNPFILTER.phy -n SNPFILTER >/dev/null &
#改用一下流程
$ mafft --auto --phylipout --thread 10 --reorder SNPFILTER.fa > SNPFILTER.phy
BeforePhylo.pl這個腳本可以在這個路徑下載:https://github.com/qiyunzhu/BeforePhylo