免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3777 | 回复: 7
打印 上一主题 下一主题

求救用PERL大规模分析蛋白质酶切得肽段及肽段质量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-03-24 21:59 |只看该作者 |倒序浏览
现在有软件可分析蛋白质得到肽段及它的质量,但都是一条序列一条序列地分析,如何实现一次分析好多序列????我编了一个,但总是不行。这是假定以T和W为切点编的
#!/usr/bin/perl -w
#use p156,p71,p175
open (AAA, "allgenenumpro2"||die ("could not open allgenenumpro2 \n";
@text =<AAA>;;
$length = @text;
for ($a=0;$a<($length);$a++)
{
$result =$text[$a];
#P189
if ($result=~/T|W/g)
{
$firstword=$1;
$secondword=$2;
$thirdword=$3;
open (STDOUT, ">;>;output.txt"||die("could not open output.txt \n";
Print "$firstword $secondword          $thirdword \n";
print
}
}

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-03-25 13:14 |只看该作者

求救用PERL大规模分析蛋白质酶切得肽段及肽段质量

if ($result=~/T|W/g)
{
$firstword=$1;
$secondword=$2;
$thirdword=$3;
open (STDOUT, ">;>;output.txt"||die("could not open output.txt \n";
Print "$firstword $secondword $thirdword \n";
print
}

這段regular expression會有問題.
它會從program的第一個第二個第三個argument
$1,$2,$3放 入$firstword,$secondword,$thirdword
中而非你所想像的..
給一個file中的例子來看看..幾行就好....
比較好幫你...

论坛徽章:
0
3 [报告]
发表于 2003-03-25 15:57 |只看该作者

求救用PERL大规模分析蛋白质酶切得肽段及肽段质量


非常感谢您,谢谢你对我的帮助。
如一个文件题目为try,它里面包括序列号DT.XXXX,然后为序列,有三个:
DT.111614  KSTSGAKAAHVSKSCKDVAKVHAKKVTSDNHKNAAANDVTSTGDSYYDKGRKVNMCWYTSANSTRGASVVKGNNVTKSASYRTGVKDWTARHSK  
DT.75196504                MVSMRSDGNYSMVSHTDYVHVKRNNKYNN                                              DT.75124407      
MSKKHKCKHKKSVVMNC
举例第三个序列:如有两个切点如H和S,则应该得到肽段为:MS,KKH,KCKH,KKS,VVMNC这五个片段

菜鸟再次感谢您!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2003-03-25 21:58 |只看该作者

求救用PERL大规模分析蛋白质酶切得肽段及肽段质量

手邊沒有perl環境...
不過可以給你一點hint....
你這個問題如果要用regular expression..
有相當的難度...如果你不是很要求速度的話...
可以用substr一個char一個char抓出來看...
然後存到一個array (例如@abc)中...
看到H或S的時候就把前面這個array..
變成一個string..利用$str = join("",@abc);
存到另一個array中...例如push(@array,$str);..
然後將@abc = ();
然後再開始新的array......
這一行全部讀完後(碰到null或\n)...
你就可以知道目前這串字可以分成幾段...

當然上面這段logic如果用C寫速度會快很多....

如果要用regular expression的話...我學藝不精..
沒法幫你...
PS:
我記得perl裡面有個$'與$`或許可用....一個是match到的前面string..
一個是match到的後面string...再缺一個match到的位置(忘了那個符號)
配合substr..理論上就可以做到...

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2003-03-25 23:19 |只看该作者

求救用PERL大规模分析蛋白质酶切得肽段及肽段质量

還有另一種解法
## [H|S]對H或S進行split....
@data = split(/[H|S]/,$line);
## 用null進行split
@data1 = split(//,$line);
$sum = 0;
for (@data) {
   $len = length($_);
   ## 取得正確的index位置....
   $sum =$sum+$len+1;
   $_ .=$data1[$sum];
}

最後@data就是你要的...沒試驗過..
不過應該是這樣才對....
Try It..

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2003-03-31 08:36 |只看该作者

求救用PERL大规模分析蛋白质酶切得肽段及肽段质量

#!/usr/bin/perl
$line = "MSKKHKCKHKKSSVVMNCSSS";
## 算line的長度,避免SSS字串出現在最後
$len1 = length($line);
# 用H或S切割$line
@data = split(/[H|S]/,$line);
## 用null進行split
@data1 = split(//,$line);
$sum = 0;

for (@data) {

$len = length($_);

# 取得正確的index位置....
$sum +=($len);
# 避免最後一筆有問題..
print "$sum\n";
  if($sum <@data1){
    $_ .=$data1[$sum];
  }
# 把加上去的char也列入考慮
  $sum++;
}
##處理SSS出現在最後面的情形
if($sum <$len1){
for($i=0;$i<$len1-$sum;$i++){
    $dat = pop(@data1);
    push(@data,$dat);
}
}


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
debug 後的code...
應該就是你要的...

论坛徽章:
0
7 [报告]
发表于 2003-04-06 04:34 |只看该作者

求救用PERL大规模分析蛋白质酶切得肽段及肽段质量

另一种解法
undef $/;
$text = <FILE>;;
my %hash;
my $last_segment;
while ($text =~ /DT.\d+/g){
        $text = $';   #save for next match
        my $temp = $&amp;;            #will be the next serial number
        $last_segment = $';    #Only useful for last time
        my $data = $`;
        $data =~ s/\s*//g;  #remove white space
        $hash{$num} = $data if($data);
        $num = $temp;
}
$last_segment =~ s/\s*//g;
$hash{$num} = $last_segment; #the last one
##Uncomment next only if you want to double check
#foreach my $key (keys(%hash)){
#        print "Serialkey,Segmenthash{$key}\n";
#}

论坛徽章:
0
8 [报告]
发表于 2003-04-06 09:45 |只看该作者

求救用PERL大规模分析蛋白质酶切得肽段及肽段质量

抱歉,俺把关键部分漏了。请把
##Uncomment next only if you want to double check
以下部分替换成:(

foreach my $key (keys(%hash)){
#print "Serialkey,Segmenthash{$key}\n";
my $d = $hash{$key};
$hash{$key}  = analyze($d);
}

sub analyze{
        my $data = shift;
        my @a;
        while ( $data =~ /[H,S]{1}/){
                #print $`.$&amp;,"\n";
                push @a,$`.$&amp;;
                $data =$';
        }
        #print $data if $data;
        push @a,$data if $data;
        return \@a;
}

其结果以最长的为例(切点H,S):
'DT.111614';
'KS', 'TS', 'GAKAAH', 'VS', 'KS', 'CKDVAKVH', 'AKKVTS', 'DNH', 'KNAAANDVTS', 'TGDS', 'YYDKGRKVNMCWYTS', 'ANS', 'TRGAS', 'VVKGNNVTKS', 'AS', 'YRTGVKDWTARH', 'S', 'K'     ];
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP