细菌全基因组测序数据构建SNP系统发育树

本次分析使用到的数据及数据处理流程参考文献“https://doi.org/10.1186/s13756-018-0352-y ”。考虑到时间及存储有限,且此次分析的目的仅为跑pipeline,因此本次测试仅用了ERP020566 中的小部分数据,见ERR.list。

整个数据处理过程包括如下步骤:

  1. 数据下载及转化:包括NCBI下载sra数据以及候选的参考基因组数据;数据预处理
  2. 参考基因组选择
  3. call SNP
  4. 构建系统发育树

吐槽文章的一个错误。文章中call snp后是把基因组中的噬菌体序列及重复序列区域去掉的(After excluding repetitive regions and mobile genetic elements, 159,154 SNP positions (length of the reference genome: 5,306,618 bp) ),而在图注中标明159,154 SNP 构建的该菌核心基因组系统发育树(The image shows a ML tree based on 159.154 SNPs of the core genome. A K. variicola isolate )。这个说法是有问题的,在查阅资料后,使用了一套新的方法构建核心基因组snp系统发育树,新方法会另写文章。

1. 数据下载及预处理

下载数据并转化为fastq格式:

#测试数据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

数据过滤:

$ 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上下载多个候选参考基因组数据:

#仅下载部分基因组数据
$ 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

选择候选的参考基因组时需注意尽量选择组装完整的基因组,同时获得数据以后从基因组中去除质粒序列,例如:

$ count.pl --pat  NC_022082.1 Klebsiella_pneumoniae_JM45.fna >tmp && mv tmp Klebsiella_pneumoniae_JM45.fna

同时下载了ERR1761507作为后续建树的外群,对于该数据的分析同上。

2. 参考基因组选择

$ refrank.py -f *PE.fastq -r *fna -t 10 &>refrank.log &
#只是为了跑个pipeline,所以只用了一个数据做测试
$ refrank.py -f ERR176156[78]* -r *fna -t 10 &>refrank.log &

得到一个refRanking.txt文件,这个文件里面有软件找出的参考基因组信息。

我仅用了部分SRA以及部分后续参考基因组,软件跑出来的结果是Klebsiella pneumoniae UHKPC33,就用该基因组作为后续分析的参考基因组了。

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以及基因组中的重复区域和前噬菌体序列等。做这步分析之前需要使用phaster在线工具注释基因组中的噬菌体序列,并使用ICEberg下的ICEfinder在线工具注释细菌基因组中的整合子结合元件等
$ snpfilter.py Klebsiella_pneumoniae_UHKPC33.fna all.snp.fa --mask region.txt

使用phaster在线工具过滤噬菌体序列。phaster在线注释出参考基因组中的噬菌体区域:

460061  490463
1724712 1733196
2918297 2978044
3294633 3340680
3480582 3519282
3955718 4006647
4213795 4235686
4696467 4709499

使用ICEfinder在线工具注释细菌基因组的整合子结合元件(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的结果手动合并成一个文本文件,这里命名为region.txt。该文件包括两列,第一列为起始位点,第二列为终止位点,中间以制表符分割。

460061  490463
740482  796624
1724712 1733196
1792161 1819646
2918297 2978044
3294633 3340680
3480582 3519282
3955718 4006647
4213795 4235686
4696467 4709499

snpfilter.py处理结果会生成fa文件,即过滤后并串联后的序列,可以用于下游分析建树。将生成的snp串联后的fa文件重命名为SNPFILTER.fa
吐槽一下,VarScan和snpfilter.py两个软件的说明文档写的真心差,有些地方靠猜。vcf格式需要转化成带有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.构建系统发育树

#可以使用一下流程。但是测试的时候用的服务器内存有限,muscle这一步太吃内存了,改用了耗内存更小的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

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

推荐阅读更多精彩内容