2016-08-16 5 views
2

Ich habe eine DNA-Sequenz, wie zum Beispiel ATCGATCG. Ich habe auch eine Datenbank von DNA-Sequenzen wie folgt formatiert:Perl: Höchste Prozentzahl für Strings

>Name of sequence1 
SEQUENCEONEEXAMPLEGATCGATC 
>Name of sequence2 
SEQUENCETWOEXAMPLEGATCGATC 

(also die ungeraden Zeilen enthalten einen Namen, und die geraden Linien enthalten eine Sequenz) Derzeit suche ich nach perfekten Übereinstimmungen zwischen meiner Sequenz und wie (übernehmen alle Variablen deklarieren) folgt Sequenzen in der Datenbank:

my $name; 
my $seq; 
my $returnval = "The sequence does not match any in database"; 
open (my $database, "<", $db1) or die "Can't find db1"; 
until (eof $database){ 
    chomp ($name = <$database>); 
    chomp ($seq = <$database>); 
    if (
     index($seq, $entry) != -1 
     || index($entry, $seq) != -1 
    ) { 
     $returnval = "The sequence matches: ". $name; 
     last; 
    } 
} 
close $database; 

gibt es eine Möglichkeit für mich, den Namen der höchsten Prozentsatz angepasst Sequenz zurückzukehren sowie Prozent Übereinstimmung zwischen dem Eintrag und der Reihenfolge in der Datenbank?

+1

Wie groß ist die Datenbank? – Zaid

+0

Nicht sicher, ob [String :: Approx] (https://metacpan.org/pod/String::Approx) hier helfen würde. – Zaid

+1

Sie können Ihre Saite zerlegen und Char durch Char gehen, auch wenn es wählerisch ist. Etwas wie es zum Beispiel in ['this post'] (http://stackoverflow.com/questions/9106978/perl-partial-match) gemacht wurde. Besser, finde ein Modul - zum Beispiel sollte ['Text :: Fuzzy'] (http://search.cpan.org/~bkb/Text-Fuzzy-0.24/lib/Text/Fuzzy.pod) es tun. – zdim

Antwort

3

String::Similarity gibt die Ähnlichkeit zwischen Strings als Wert zwischen 0 und 1 zurück, wobei 0 völlig unähnlich ist und 1 genau gleich ist.

my $entry = "AGGUUG" ; 
my $returnval; 
my $name; 
my $seq; 
my $currsim; 
my $highestsim = 0; 
my $highestname; 
open (my $database, "<", $db1) or die "Can't find db1"; 
until (eof $database){ 
    chomp ($name = <$database>); 
    chomp ($seq = <$database>); 
    $currsim = similarity $entry, $seq, $highestsim; 
    if ($currsim > $highestsim) { 
     $highestsim = $currsim; 
     $highestname = $name; 
    } 
} 
$highestsim = $highestsim * 100; 
my @names = split(/>/, $highestname); 
$returnval = "This sequence matches " . $names[1] . " the best with " . $highestsim . "% similarity"; 
close $database; 
+1

Sie sollten eine Leistungsverbesserung sehen, wenn Sie '$ highestsim' als drittes Argument für' Ähnlichkeit' übergeben - es bewirkt, dass es aufhört zu vergleichen, sobald die Ähnlichkeit unter das gegebene Limit fällt. –

+0

Macht Sinn. Ich werde es hinzufügen –