2016-08-18 2 views
0

Kann diese Frage zu verallgemeinert sein, aber ich bin völlig bei diesem fest. Jede Art von Hilfe geschätzt:Von der verketteten Fasta-Datei, wie man einzelnen Bereich der Positionen in jeder Proteinsequenz findet

Ich habe ein Protein FASTA-Datei (protein.txt) wie:

>a 
mnspq 
>b 
rstuvw 
>c 
mnqa 

zu beachten, dass die Länge von A, B und C-Proteine ​​sind 5,6 bzw. 4 (Gesamtlänge = 15)

jetzt habe ich einige zufällige Bereiche (Berechnung extrahiert wird auf Gesamtlänge basiert) und (file1.txt) als sparen:

2-3 
4-10 
11-14 

die Länge jedes Protein (in der gesamten Länge) wie in Protein-Datei zu sehen ist in einer anderen Datei (file2.txt) gespeichert als:

a 1-5 
b 6-11 
c 12-15 

nun von file1 Werten mag ich die file2 Werte ändern und versuchen, für jede Proteinsequenz einzelnen Bereich zu berechnen, Für die oben Eingang, wird der Ausgang sein:

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

mit anderen Worten, wenn ich meint alle Sequenzen erste verketten und einige Bereiche von der verketteten Datei derermine, wie kann ich einzelnen Bereich von Positionen in jeder Proteinsequenz finden

Danke

+0

Sollte es nicht 'c 1-3' stattdessen sein? – choroba

+0

upps .. meine Schuld .. Sie haben absolut Recht, Sir .. –

Antwort

0

Ich denke, die letzte Zeile der Antwort c 1-3 sein soll:

|---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 zur Rettung! Zuerst werden die Bereiche von Datei1 in ein Array eingelesen. Dann werden Proteine ​​aus Datei2 gelesen, und für jeden Bereich, der sich mit dem Bereich überlappt, werden "Anfang" und "Ende" berechnet und gedruckt.

#!/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"; 
} 
Verwandte Themen