2016-08-18 82 views
0

可能這個問題太籠統了,但我完全停留在這個。任何類型的幫助理解:從連接的fasta文件中,如何找到每個蛋白質序列中的個別位置範圍

我有一個蛋白FASTA文件(protein.txt)像:

>a 
mnspq 
>b 
rstuvw 
>c 
mnqa 

注意,A,B和C蛋白的長度是5,6和4分別(總長度= 15)

我現在已經提取的一些隨機範圍(計算是基於總長度),並將其保存(FILE1.TXT)爲:

2-3 
4-10 
11-14 

每種蛋白的長度(總內長度)作爲蛋白質文件中看到保存在另一個文件(FILE2.TXT)爲:

a 1-5 
b 6-11 
c 12-15 
從文件1的值

現在,我要修改的文件2的值,並嘗試計算單個範圍爲每一個蛋白質序列,對於上述輸入,輸出將是:

a 2-3,4-5 
b 1-5, 6 
c 2-5 

換句話說,如果我第一串聯我所有的序列和derermine從連結文件的一些範圍,我怎麼能找到的每一個蛋白質序列中的位置個體範圍

謝謝

+0

不是它應該是'c 1-3'嗎? – choroba

+0

upps ..我的錯..你是絕對正確的先生.. –

回答

0

我想答案的最後一行應該是c 1-3

|---a---| |---b-----| |--c--| 
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 
    |-| |-----------| |-----| 
1 2 3 4 5 1 2 3 4 5 6 1 2 3 4 

Perl來救援!首先,將file1的範圍讀入數組。然後,從file2中讀取蛋白質,並且對於與範圍重疊的每個範圍,計算並打印「開始」和「結束」。

#!/usr/bin/perl 
use warnings; 
use strict; 

my @ranges; 
open my $f1, '<', 'file1.txt' or die $!; 
while (<$f1>) { 
    chomp; 
    push @ranges, [ split /-/ ]; 
} 

open my $f2, '<', 'file2.txt' or die $!; 
while (<$f2>) { 
    my ($protein, $range) = split; 
    print "$protein"; 
    my $separator = ' '; 
    my ($from, $to) = split /-/, $range; 

    shift @ranges while @ranges && $ranges[0][1] < $from; 
    last unless @ranges; 

    while (@ranges && $ranges[0][0] <= $to) { 
     my $start = $ranges[0][0]; 
     $start = $from if $from > $start; 
     my $end = $ranges[0][1]; 
     $end = $to if $end > $to; 
     $_ -= $from - 1 for $start, $end; 

     print $separator, $start == $end ? $start : "$start-$end"; 
     $separator = ','; 

     if ($ranges[0][1] < $to) { 
      shift @ranges; 
     } else { 
      $ranges[0][0] = $to + 1; 
     } 
    } 
    print "\n"; 
} 
相關問題