系统进化分析全记录——以HDZIP3家族为例(附自动化phylogeny程序)

一、phylogeny总体分析流程

系统进化分析已经是做生物学、生物信息的一项基础分析方法了。确定同源基因、进化历史、基因家族分析、分子进化等都需要这一技能。总体来说,系统进化分析包括以下几个步骤:多序列的获取(blast/hmmsearch获取同源序列)、多序列比对、保守信息位点的筛选、核酸替换模型的确定以及构建系统进化树

具体的,对于构建某一基因家族的进化树(以HD-ZIP3家族)来说分析流程如下:


基因家族分析流程

二、软件的准备

  • 具体软件包括有:
    • 比对软件:blast、hmmer
    • 多序列比对:mafft、pal2nal.pl
    • 保守信息位点筛选:Gblocks
    • 系统进化树(ML树)的构建:iqtree
    • 万能fastq/fasta小工具:seqkit
  • 软件安装可以利用conda进行自动化安装。安装教程可参考转录组学习一(软件安装)

三、基因家族的序列获取

找序列属于较花时间步骤,若研究的基因所属家族有人发过基因家族的纹章,则可以根据文献下载相关序列,若没有人研究,则需要对选取物种的基因组/CDS/PEP文件做blast/hmmsearch搜索以及后续繁琐的筛选。

  1. 这里我们选取的HD-ZIP III属于转录因子,则可以根据植物转录因子数据库(http://planttfdb.cbi.pku.edu.cn/)下载目标物种中的HDZIP家族的CDS及PEP序列。
### 根据目标,下载拟南芥物种中的pep序列
wget http://planttfdb.cbi.pku.edu.cn/download_seq.php?sp=Ath\&fam=HD-ZIP

##下载拟南芥CDS序列
wget http://planttfdb.cbi.pku.edu.cn/download/seq/Ath_cds.fas.gz
  1. 根据文献,HD-ZIP III家族包括以下蛋白结构域。其中,MEKHLA属于HD-ZIP3的识别结构域,根据数据库Pfam数据库下载此结构域的hmm模型文件


    HDZIP3蛋白结构域信息
wget http://pfam.xfam.org/family/PF08670/hmm
mv hmm MEKHLA
  1. 筛选得到拟南芥中的HDZIP3家族序列
##根据MEKHLA进行hmmsearch筛选
hmmsearch --domtblout ath.out --cut_nc MEKHLA download_seq.php\?sp\=Ath\&fam\=HD-ZIP

## 对结果整理,并获得拟南芥中HDZIP3的cds序列
grep -v "#" ath.out |cut -d '|' -f 1 |seqkit grep -r -f - Ath_cds.fas.gz
 > hdzip3_ath_cds.fas
  1. 其它物种同拟南芥的过程,最后再对序列的id名称进行修改。一个基因的多个转录本可以去掉。

四、多序列比对

一般情况多序列比对直接根据mafft比对即可。对于基因家族来说,更准确的比对需先对基因家族的PEP序列比对得到氨基酸比对矩阵,再根据pal2nal转为核苷酸比对矩阵

## 氨基酸比对
mafft --auto hdzip3_pep.fas > hdzip3_pep_aln.fas

## 根据提供的cds序列进行pal2nal转换为氨基酸矩阵。
pal2nal.pl hdzip3_pep_aln.fas hdzip3_cds.fas -output fasta > hdzip3_cds_aln.fas

这里pal2nal会经常报错,大部分情况都是cds跟pep序列的名字不一致,或者cds序列跟pep序列不能完全对应

五、保守信息位点的筛选

得到核苷酸比对矩阵之后就要对其中不好的位点进行过滤删除。得到建树有用的信息位点。这里我们所用的程序是Gblocks。

## 筛选信息位点,这里根据个人经验-b5参数选择保留含有gap的全部信息位点
Gblocks hdzip3_cds_aln.fas -t=c -b4=5 -b5=a >Gblocks.log
### 结果文件hdzip3_cds_aln.fas-gb即为筛选后的文件,可重新命名。html文件可用浏览器打开查看挑选具体的位点。

六、核酸替换模型的选择及构建最大似然树(ML树)

传统步骤里,核酸替换模型是需要利用modelfinder/modelgenerator软件算出模型,再用phylip/mega/raxml跑树。去年特别火的软件iqtree完全整合了这两个步骤
并如其名——智能化建树。

## -bb 参数为快速bootstrap检验,对于序列较少的参数则-b 参数 常规bootstrap即可
iqtree -s hdzip3_cds_aln.fas-gb -bb 10000 -pre hdzip3 -nt AUTO >iqtree.log

结果hdzip3.treefile即为我们要的树文件,后续可利用ITOL/Figtree/ggtree等一系列的可视化的软件对树文件进行美化。

七、结果

整套流程走下来,并对树文件进行了些简单的可视化。结果如下图,可以看到各个支系都分的很清楚,各物种的位置较符合真实的系统位置,拓扑结构的支持率也普遍都很高。


hdzip3 phylogeny

八、自动化构建系统发育树程序。

其实从多序列比对一直到构建系统进化树,已经是一套较为标准的流程了。之前也对这套流程做了个整合,写了个小程序。Phylogeny系统进化树的一键化构建——Perl_pipeline。之后对这个程序做了个优化,添加了可选参数以及氨基酸比对矩阵转为核酸比对矩阵 ( 流程图中的 fasta2tree .pl)。做一个分享~

fasta2tree.pl 帮助信息

#!/usr/bin/env perl
use strict;
use File::Copy;
use Getopt::Long;

my $usage = <<USAGE;
Usage:
    perl $0 -in MultiSequences.fasta -out OutPrefix -type d/c/p

For example:
    perl $0 -in AP3.fasta -out ap3_tree -type c

This Pipeline depends on the following software that can be run directly in terminal:
1. mafft (v7.310)
2. pal2nal (v14)
3. Gblocks (0.91b)
4. iqtree (1.55)
                            by Wang Tianpeng 
                            Version 1.2
                            2018/11/12                          

USAGE
if (@ARGV==0){die $usage}
my($fasta,$out_prefix,$type);
GetOptions(
    "in=s" => \$fasta,
    "out=s" => \$out_prefix,
    "type=s"=> \$type,
);

my $pwd0=`pwd`;
chomp $pwd0;

# Preliminary Test: Detecting the softwares dependency
## mafft
print STDERR "\nDetecting the dependency softwares\n\n";
my $software=`mafft --help 2>&1`;
if($software=~/MAFFT/){
    print STDERR "MAFFT:\tOK\n";
}else{
    die "Mafft\tfailed\n";
}
## pal2nal
my $software=`pal2nal.pl 2>&1`;
if($software=~/pal2nal.pl/){
    print STDERR "PAL2NAL:\tOK\n";
}else{
    die "pal2nal\tfailed\n";
}

## Gblocks
my $sofware1=`Gblocks -a -b >111`;
open IN,"111" or die "$!";
<IN>;my $software_info=<IN>;
if($software_info=~/^\*/){
    print STDERR "Gblocks:\tOK\n";
}else{
    die "Gblocks\tfailed\n";
}
close IN;system("rm 111"); 
## iqtree
$software=`iqtree 2>&1`;
if ($software=~/IQ-TREE/){
    print STDERR "IQtree:\tOK\n";
}else{
    die "iqtree\tfailed\n";
}

# step1 create temporary directory;
print "\n======================================\n";
mkdir "$out_prefix.tmp" unless -e "$out_prefix.tmp";
chdir "$out_prefix.tmp";
my $pwd1 = `pwd`;chomp($pwd1); #print STDERR "PWD:$pwd";
open IN,"$pwd0\/$fasta" or die "$!";
open OUT,">$fasta" or die "$!";
open OUT2, ">$fasta.pep" or die "$!";

my($seq,$seq_name,@seq_name,%hash_seq);
while(<IN>){
    s/\r?\n//;
    if(/^>/){
        $seq_name=$_;
        push @seq_name,$seq_name;
    }else{
        $hash_seq{$seq_name}.=$_;
    }
}
foreach (@seq_name){
    print OUT "$_\n$hash_seq{$_}\n";
    print OUT2 "$_\n",&cds2pep($hash_seq{$_}),"\n";
}
close IN;close OUT;
#open OUT,">","genome.fasta" or die "cant create file genome.fasta,$!";

# step2 MultiSequences Alignment with mafft and pal2nal;
print "\n=====================================================\n";
print "STEP1 MultiSequences Alignment with mafft\n\n";
mkdir "1.Mafft" unless -e "1.Mafft";
unless (-e "1.Mafft.ok"){
    chdir "1.Mafft";
    my $pwd=`pwd`;print STDERR "PWD:$pwd";
    my $command="mafft --auto $pwd1\/$fasta.pep >$out_prefix.aln.pep.fas 2>mafft.log";
    print STDERR (localtime).":  $command\n";
    system($command)==0 or die "can not execute :$command\n";
    my $command="pal2nal.pl $out_prefix.aln.pep.fas $pwd1\/$fasta -output fasta > $out_prefix.aln.cds.fas";
    system($command)==0 or die "can not execute: $command\n";
    my $pwd_mafft=`pwd`;chomp($pwd_mafft);
    chdir "..";
    open OUT,">1.Mafft.ok" or die "$!";close OUT;
}else{
    print STDERR "CMD(skipped): mafft \n";
}
my $pwd_mafft="$pwd1\/1.Mafft";#print "$pwd_mafft\n";


# step3 informative alignment points filter with Gblocks
#my $pwd =`pwd`;print "$pwd\n";
print "\n===================================================\n";
print "STEP2 selection of informative blocks with Gblocks\n\n";
mkdir "2.Gblocks" unless -e "2.Gblocks";
unless (-e "2.Gblocks.ok"){
    chdir "2.Gblocks";
    my $pwd=`pwd`;print STDERR "PWD: $pwd\n";
    my $command="Gblocks $pwd_mafft\/$out_prefix.aln.cds.fas -t=$type -b4=5 -b5=a >Gblocks.log";
    print STDERR (localtime).":  $command\n";
    system($command) or die "can not execute : $command\n";
    my $gb_files="$pwd_mafft"."\/$out_prefix.aln.cds.fas-gb\*"; #my $command_move="mv $test .";print "$command_move\n";
    system("mv $gb_files \.")==0 or die "cant move file\n";
    chdir "..";
    open OUT,">2.Gblocks.ok" or die "$!";close OUT;
}else{
    print STDERR "CMD(skipped):Gblocks \n";
}
my $pwd_gblock="$pwd1\/2.Gblocks";

# step4 Construct phylogeny tree with IQtree
print "\n====================================================\n";
print "STEP3 Construction of phylogeny tree with iqtree\n\n";
mkdir "3.IQtree" unless -e "3.IQtree";
unless (-e "3.IQtree.ok"){
    chdir "3.IQtree";
    my $pwd_iqtree=`pwd`;print STDERR "PWD:  $pwd_iqtree\n";
    my $command="iqtree -s $pwd_gblock\/$out_prefix.aln.cds.fas-gb -bb 10000 -pre $out_prefix -nt AUTO >iqtree.log";
    print STDERR (localtime).":  $command\n";
    system($command)==0 or die "can not execute: $command\n";
    system("cp $out_prefix.treefile ../..")==0 or die "can not copy file\n";

}
print STDERR "ALL commands complete! :-)\n";


sub cds2pep {
    my %cds2pep = (
        "TTT" => "F",
        "TTC" => "F",
        "TTA" => "L",
        "TTG" => "L",
        "TCT" => "S",
        "TCC" => "S",
        "TCA" => "S",
        "TCG" => "S",
        "TAT" => "Y",
        "TAC" => "Y",
        "TAA" => "*",
        "TAG" => "*",
        "TGT" => "C",
        "TGC" => "C",
        "TGA" => "*",
        "TGG" => "W",
        "CTT" => "L",
        "CTC" => "L",
        "CTA" => "L",
        "CTG" => "L",
        "CCT" => "P",
        "CCC" => "P",
        "CCA" => "P",
        "CCG" => "P",
        "CAT" => "H",
        "CAC" => "H",
        "CAA" => "Q",
        "CAG" => "Q",
        "CGT" => "R",
        "CGC" => "R",
        "CGA" => "R",
        "CGG" => "R",
        "ATT" => "I",
        "ATC" => "I",
        "ATA" => "I",
        "ATG" => "M",
        "ACT" => "T",
        "ACC" => "T",
        "ACA" => "T",
        "ACG" => "T",
        "AAT" => "N",
        "AAC" => "N",
        "AAA" => "K",
        "AAG" => "K",
        "AGT" => "S",
        "AGC" => "S",
        "AGA" => "R",
        "AGG" => "R",
        "GTT" => "V",
        "GTC" => "V",
        "GTA" => "V",
        "GTG" => "V",
        "GCT" => "A",
        "GCC" => "A",
        "GCA" => "A",
        "GCG" => "A",
        "GAT" => "D",
        "GAC" => "D",
        "GAA" => "E",
        "GAG" => "E",
        "GGT" => "G",
        "GGC" => "G",
        "GGA" => "G",
        "GGG" => "G",
    );
    my $seq = shift @_;
    my $fram = shift @_;
    my $gene = shift @_;
    $seq =~ s/\w{$fram}//;
    my $pep;
    while ((length $seq) >= 3) {
        $seq =~ s/(\w{3})//;
        $pep .= $cds2pep{$1};
    }
    return $pep;
}









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

推荐阅读更多精彩内容