蛋白反转数据库及合并程序
时间:2007-06-07 来源:ttyuren
给臭臭写的第一个程序,读入一个蛋白数据库文件,格式为:
>IPI:IPI00000001|SP:P00683
1AAABBBCCCDDD
2EEEFFFGGGHHH
3AAABBBCCCDDD
4EEEFFFGGGHHH >IPI:IPI00000002|SP:P00683
5IIIJJJKKKLLL
6MMMNNNOOOPPP
7IIIJJJKKKLLL
8MMMNNNOOOPPP >IPI:IPI00000003|SP:P00683
9QQQRRRSSSTTT
10UUUVVVWWWXXX
11QQQRRRSSSTTT
12UUUVVVWWWXXX >IPI:IPI00000004|SP:P00683
13YYYZZZAAABBB
14CCCDDDEEEFFF
15YYYZZZAAABBB
16CCCDDDEEEFFF 做成反转数据库并写在原文件末尾。 反转数据库即把正向数据库中条目数据按逆序列读取,重新生成一个新的反转数据库,同时对反转库中数据做特征标识(在蛋白号前加R表示)。 反转数据库的作用是用来评判结果可信度的,检索的时候,正库反库同时检索,就会得出一部分正库结果P,一部分反库结果R,假阳性率计算FP=2R/(P+R)×100% 。通过设置过滤参数,减少检索数据中R的数目,即可提高结果的置信度。 代码: ###--------------------------------### #! /usr/bin/perl -w
use strict; open (IN, "<testP.txt")||die("Can't open original file: $!"); open (OUT, ">testPR.txt")||die("Can't open original file: $!"); print OUT $_ while(<IN>); #首先拷贝一份原文件
seek (IN,0,0); my $gotHeader = 1; #数据行标识
my $curLine="";
my @head; while(<IN>){ (s/^>/>R/)
?(push (@head,$_)) && ($gotHeader = 1) :($curLine .= $_ ) && ($gotHeader = 0); ## {rev_write(); $curLine = "";} if ($gotHeader && $curLine); ##error if (($gotHeader and $curLine)) {
rev_write();
$curLine = "";
} } rev_write(); #最后一条记录,单独输出 close IN;
close OUT;
#--------反转并写入OUT文件的子程序---------# sub rev_write{
print OUT (shift @head); #输出RINI标识行
chomp $curLine; #清楚数据行末尾回车
my @letter= split(//, $curLine); #数据行内容存入数组
print OUT (pop @letter) for (0..$#letter); #倒序输出
print OUT "\n";
} ###--------------END--------### 原想把判断部分用这条语句代替的, {rev_write(); $curLine = "";} if ($gotHeader && $curLine); 可是编译没通过,说syntax error,看来if倒装不允许多行?还是格式有问题? 而且程序不允许原文件有空行。小臭安慰说"没关系了,现在有别人的文件可以用...",费了半天劲,还是只能用别人的文件,郁闷中...继续修改。
OK,修改完成,加入 s/^\n$//; 语句去除空行; ^_^
1AAABBBCCCDDD
2EEEFFFGGGHHH
3AAABBBCCCDDD
4EEEFFFGGGHHH >IPI:IPI00000002|SP:P00683
5IIIJJJKKKLLL
6MMMNNNOOOPPP
7IIIJJJKKKLLL
8MMMNNNOOOPPP >IPI:IPI00000003|SP:P00683
9QQQRRRSSSTTT
10UUUVVVWWWXXX
11QQQRRRSSSTTT
12UUUVVVWWWXXX >IPI:IPI00000004|SP:P00683
13YYYZZZAAABBB
14CCCDDDEEEFFF
15YYYZZZAAABBB
16CCCDDDEEEFFF 做成反转数据库并写在原文件末尾。 反转数据库即把正向数据库中条目数据按逆序列读取,重新生成一个新的反转数据库,同时对反转库中数据做特征标识(在蛋白号前加R表示)。 反转数据库的作用是用来评判结果可信度的,检索的时候,正库反库同时检索,就会得出一部分正库结果P,一部分反库结果R,假阳性率计算FP=2R/(P+R)×100% 。通过设置过滤参数,减少检索数据中R的数目,即可提高结果的置信度。 代码: ###--------------------------------### #! /usr/bin/perl -w
use strict; open (IN, "<testP.txt")||die("Can't open original file: $!"); open (OUT, ">testPR.txt")||die("Can't open original file: $!"); print OUT $_ while(<IN>); #首先拷贝一份原文件
seek (IN,0,0); my $gotHeader = 1; #数据行标识
my $curLine="";
my @head; while(<IN>){ (s/^>/>R/)
?(push (@head,$_)) && ($gotHeader = 1) :($curLine .= $_ ) && ($gotHeader = 0); ## {rev_write(); $curLine = "";} if ($gotHeader && $curLine); ##error if (($gotHeader and $curLine)) {
rev_write();
$curLine = "";
} } rev_write(); #最后一条记录,单独输出 close IN;
close OUT;
#--------反转并写入OUT文件的子程序---------# sub rev_write{
print OUT (shift @head); #输出RINI标识行
chomp $curLine; #清楚数据行末尾回车
my @letter= split(//, $curLine); #数据行内容存入数组
print OUT (pop @letter) for (0..$#letter); #倒序输出
print OUT "\n";
} ###--------------END--------### 原想把判断部分用这条语句代替的, {rev_write(); $curLine = "";} if ($gotHeader && $curLine); 可是编译没通过,说syntax error,看来if倒装不允许多行?还是格式有问题? 而且程序不允许原文件有空行。小臭安慰说"没关系了,现在有别人的文件可以用...",费了半天劲,还是只能用别人的文件,郁闷中...继续修改。
OK,修改完成,加入 s/^\n$//; 语句去除空行; ^_^
相关阅读 更多 +