计算旁系同源基因的Ks

旁系同源基因简单来说就是同一物种内,通过基因复制产生的不同的两种基因。

计算直系同源的办法网上已经很详细,今天我来补充一下计算旁系同源基因ks的办法。

最简单方法1 用wgd 这个软件

conda create -n py36 python=3.6.7 blast mcl muscle mafft prank paml fasttree cmake libpng mpi=1.0=mpich
conda activate py36
git clone https://github.com/arzwa/wgd.git
cd wgd
pip install .
#可能要下载i-ADHoRe-3.0  http://bioinformatics.psb.ugent.be/webtools/i-adhore/licensing/
#wgd mcl 生成.mcl文件  鉴定基因组内的同源基因
#只需要一个物种的cds就可以了 计算方法是Yn00 
#以毛果杨4.1版本为例
nohup wgd mcl -n 20 --cds --mcl -s Ptrichocarpa_533_v4.1.cds.fa  -o Ptrichocarpa_533.out  &
nohup wgd ksd  Ptrichocarpa_533_v4.1.cds.fa.blast.tsv.mcl  Ptrichocarpa_533_v4.1.cds.fa  -n 10  &
#wgd mcl 生成的blast.tsv.mcl放在和cds.fa文件一个文件夹

这里建议取出ks值用R画图
用awk取出第一列和第九列

cat populus_simonii_CDS.fa.ks.tsv | awk '{print $1"\t"$9}' > p_siminii.txt
data01<-read.table("simks.txt",header = T,sep="\t")
names(data01)<-c("Species","Ks")
data01[,1] <- "P.sim"
p1<-ggplot(data = data01,aes(x =Ks,fill=Species))+geom_histogram(position = "identity",bins=250,alpha=0.15,aes(y = ..density..))+xlim(0,3)+ylim(0,2)+stat_density(geom = "line",position = "identity",aes(colour = Species))+theme_bw()+
  geom_vline(xintercept = Peak1[[1]],colour="red",linetype="dashed") +
  geom_text(aes(x=Peak1[[1]], y= Peak1[[2]]+0.3,label=paste("Ks =",round(Peak1[[1]],4))),color="black") +
  theme(axis.title = element_text(size=8),axis.text=element_text(size=8),legend.position =  "top")
p1
densFindPeak <- function(x){
  td <- density(x)
  maxDens <- which.max(td$y)
  list(x=td$x[maxDens],y=td$y[maxDens])
}
S1 <- data01[data01$Species=="P.sim",]
S1_limit <- S1$Ks[S1$Ks>=0.005 & S1$Ks<=3]
S1_limit = na.omit(S1_limit)
Peak1 = densFindPeak(S1_limit)

第二种方法 KaksCalculator的办法 利用MCScanX提取同源基因对
这里还是用从
https://phytozome.jgi.doe.gov/pz/portal.html#!info?alias=Org_Ptrichocarpa_er 下载数据

#需要下载 clustalw KaKs_Calculator2.0 ParaAT2.0 blast MCScanX
#先处理蛋白质数据只留下序列名id
python chang.py  Ptrichocarpa_533_v4.1.protein.fa >ptr.pep
 makeblastdb -in ptr.pep -dbtype prot
nohup blastp -query  ptr.pep -db ptr.pep -evalue 1e-10  -num_threads 20 -out ptr_ptr_blastp_out.m6 -outfmt 6 &
mv ptr_ptr_blastp_out.m6 ptr.blast
#处理gff
grep -v "#" Ptrichocarpa_533_v4.1.gene.gff3 >ptr.gff3
awk '$3 == "mRNA" {print $1 "\t" $9 "\t" $4 "\t" $5}' ptr.gff3 | sed 's/.v4.1/\t/g' |sed 's/ID=//g' | awk '{print $1 "\t" $2 "\t" $4  "\t" $5}'> ptr. gff
MCScanX ptr
 echo "20" > proc
grep -v '#' ptr.collinearity | awk '{print $3 "\t" $4}' > ptr.homolog
ParaAT.pl -h ptr.homolog -n ptr.fa  -a ptr.pep -m clustalw2 -p proc -f axt -o ptr_ptr
cd ptr_ptr/
for i in `ls *.axt`;do KaKs_Calculator -i $i -o ${i}.kaks -m YN;done
for i in `ls *.kaks`;do awk 'NR>1{print $1 "\t" $4}' $i >>ptrkaks.txt;done

计算4DTv值用下面perl脚本 从githup修改来的

#!/usr/bin/perl
use strict;
##author: sun ming'an, sunma@genomics.org.cn
##modifier: fanwei, fanw@genomics.org.cn
##correction: LiJun, junli@genomics.org.cn
##Date: 2008-9-24

##4dtv (transversion rate on 4-fold degenerated sites) are calculated with HKY substitution models
##Reference: M. Hasegawa, H. Kishino, and T. Yano, J. Mol. Evol. 22 (2), 160 (1985)

die "perl $0 AXTfile > outfile\n" unless( @ARGV == 1);

my %codons=(
'CTT'=>'L', 'CTC'=>'L', 'CTA'=>'L', 'CTG'=>'L',
'GTT'=>'V', 'GTC'=>'V', 'GTA'=>'V', 'GTG'=>'V',
'TCT'=>'S', 'TCC'=>'S', 'TCA'=>'S', 'TCG'=>'S',
'CCU'=>'P', 'CCC'=>'P', 'CCA'=>'P', 'CCG'=>'P','CCT'=>'P',
'ACU'=>'T', 'ACC'=>'T', 'ACA'=>'T', 'ACG'=>'T','ACT'=>'T',
'GCT'=>'A', 'GCC'=>'A', 'GCA'=>'A', 'GCG'=>'A',
'CGT'=>'R', 'CGC'=>'R', 'CGA'=>'R', 'CGG'=>'R',
'GGU'=>'G', 'GGC'=>'G', 'GGA'=>'G', 'GGG'=>'G','GGT'=>'G'
);

my %transversion = (
        "A" => "TC",
        "C" => "AG",
        "G" => "TC",
        "T" => "AG",
);

my $axtFile = shift;

open(AXT,"$axtFile")||die"Cannot open $axtFile\n";
$/ = "\n\n";
my @seqs = <AXT>;
$/ ="\n";
close AXT;

print "tag\t4dtv_corrected\t4dtv_raw\tcondon_4d\tcodon_4dt\n";
foreach my $line ( @seqs ){
        chomp $line;
        if( $line =~ /^(\S+)\n(\S+)\n(\S+)$/ ){
                my $tag = $1;
                my $seq1 =$2;
                my $seq2 =$3;
                my ($corrected_4dtv, $raw_4dtv, $condon_4d, $codon_4dt) = &calculate_4dtv($seq1, $seq2);
                print "$tag\t$corrected_4dtv\t$raw_4dtv\t$condon_4d\t$codon_4dt\n";
        }
}



sub calculate_4dtv {
        my($str1, $str2) = @_;

        my ($condon_4d, $codon_4dt) = (0,0);
                my ($V,$a,$b,$d) = (0,0,0,0);
                my %fre=();
        for( my $i = 0; $i < length($str1); $i += 3){
                my $codon1 = substr($str1, $i, 3);
                my $codon2 = substr($str2, $i, 3);
                my $base1= uc(substr($str1, $i+2, 1));
                my $base2= uc(substr($str2, $i+2, 1));

                if( exists $codons{$codon1} && exists $codons{$codon2} && $codons{$codon1} eq $codons{$codon2} ){
                                        $fre{$base1}++;
                                        $fre{$base2}++;
                    $condon_4d++;
                    $codon_4dt++ if(is_transversion($codon1,$codon2));
                }
        }

                if($condon_4d > 0){
                        $V=$codon_4dt / $condon_4d; ##this is raw 4dtv value
                        ##correction the raw 4dtv values by HKY substitution model
                        $fre{"Y"}=$fre{"T"}+$fre{"C"};
                        $fre{"R"}=$fre{"A"}+$fre{"G"};
                        foreach (keys %fre){
                                $fre{$_}=0.5*$fre{$_}/$condon_4d;
                        }

                        if($fre{Y}!=0 && $fre{R}!=0 && $fre{A}!=0 && $fre{C}!=0 && $fre{G}!=0 && $fre{T}!=0){
                                $a=-1*log(1-$V*($fre{T}*$fre{C}*$fre{R}/$fre{Y}+$fre{A}*$fre{G}*$fre{Y}/$fre{R})/(2*($fre{T}*$fre{C}*$fre{R}+$fre{A}*$fre{G}*$fre{Y})));
                                if (1-$V/(2*$fre{Y}*$fre{R}) > 0) {
                                        $b=-1*log(1-$V/(2*$fre{Y}*$fre{R}));
                                        $d=2*$a*($fre{T}*$fre{C}/$fre{Y}+$fre{A}*$fre{G}/$fre{R})-2*$b*($fre{T}*$fre{C}*$fre{R}/$fre{Y}+$fre{A}*$fre{G}*$fre{Y}/$fre{R}-$fre{Y}*$fre{R});
                                }else{
                                        $d = "NA";
                                }
                        }else{
                                $d = "NA";
                        }


                }else{
                        $V="NA";
                        $d="NA";
                }

        return ($d,$V,$condon_4d, $codon_4dt);

}


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