2016-08-16 4 views
2

У меня есть последовательность ДНК, например, ATCGATCG. У меня также есть база данных ДНК-последовательности, отформатированных следующим образом:Perl: Return Самый высокий процент для строк

>Name of sequence1 
SEQUENCEONEEXAMPLEGATCGATC 
>Name of sequence2 
SEQUENCETWOEXAMPLEGATCGATC 

(Таким образом, нечетные строки содержат имя и четные строки содержат последовательность) В настоящее время я ищу для идеальных матчей между моей последовательностью и последовательности в базе данных следующим образом (предполагается, что все переменные объявлены):

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; 

есть ли способ для меня, чтобы вернуть имя самой высокой процентной согласованной последовательности, а также процентное совпадение существует между ввозом и последовательность в базе данных?

+1

В каком объеме находится база данных? – Zaid

+0

Не уверен, что ['String :: Approx'] (https://metacpan.org/pod/String::Approx) поможет вам здесь. – Zaid

+1

Вы можете разбить свою строку и повести char на char, даже если она придирчива. Например, что-то вроде этого было сделано в ['this post'] (http://stackoverflow.com/questions/9106978/perl-partial-match). Лучше найти модуль - например, ['Text :: Fuzzy'] (http://search.cpan.org/~bkb/Text-Fuzzy-0.24/lib/Text/Fuzzy.pod). – zdim

ответ

3

String::Similarity возвращает сходство между строками как значение от 0 до 1, 0 совершенно несходное, а 1 - точно такое же.

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

Вы должны увидеть улучшение производительности, если вы передадите '$ highsim' в качестве третьего аргумента в' сходство' - он заставляет его прекратить сравнивать, когда сходство падает ниже заданного предела. –

+0

Делает смысл. Я добавлю это –

Смежные вопросы