Устранение унифицированных значений в моем Perl-хэше массивов - PullRequest
0 голосов
/ 24 марта 2019

Я успешно создал хэш массивов и использую его для вычисления баллов лог-шансов для каждой последовательности ДНК из файла ( Создание хэша массивов для последовательностей ДНК, Perl имеет формат входного файла).Я получаю оценку за каждую последовательность, но я получаю предупреждение за каждый расчет.Естественно, я хочу убрать предупреждение.Предупреждение: Use of uninitialized value in string eq at line 148.

Вот краткая версия кода (я могу выложить полный код при необходимости):

use strict;
use warnings;
use Data::Dumper;

#USER SPECIFICATIONS
print "Please enter the filename of the fasta sequence data: ";
my $filename1 = <STDIN>;

#Remove newline from file
chomp $filename1;

#Open the file and store each dna seq in hash
my %id2seq = ();
my %HoA = ();
my %loscore = ();
my $id = '';
open (FILE, '<', $filename1) or die "Cannot open $filename1.",$!;
my $dna;
while (<FILE>)
{
    if($_ =~ /^>(.+)/)
    {
         $id = $1; #Stores 'Sequence 1' as the first $id, for example
    }
    else
    {
        $HoA{$id} = [ split(//) ]; #Splits the contents to allow for position reference later
        $id2seq{$id} .= $_; #Creates a hash with each seq associated to an id number, used for calculating tables that have been omitted for space
        $loscore{$id} .= 0; #Creates a hash with each id number to have a log-odds score
    }
}
close FILE;

#User specifies motif width
print "Please enter the motif width:\n";
my $width = <STDIN>;

#Remove newline from file
chomp $width;

#Default width is 3 (arbitrary number chosen)
if ($width eq '')
{
    $width = 3;
}

#Omitting code about $width<=0, creation of log-odds score hash to save space

foreach $id (keys %HoA, %loscore)
{
    for my $pos (0..($width-1))
    {
        for my $base (qw( A C G T))
        {
            if ($HoA{$id}[$pos] eq $base) #ERROR OCCURS HERE
            {
                $loscore{$id} += $logodds{$base}[$pos];
            }
            elsif ( ! defined $HoA{$id}[$pos]) 
            {
                print "$pos\n"; 
            }
        }
    }
}
print Dumper(\%loscore);

Вывод, который я получаю:

Use of uninitialized value in string eq at line 148, <STDIN> line 2.
2
(This error repeats 4 times for each position - most likely due to matching to each $base?)

$VAR1 = {
         'Sequence 15' => '-1.27764697876093',
         'Sequence 4' => '0.437512962981119',
         (continues for 29 sequences)
        }

Подводя итог, я хочу вычислить оценку лог-шансов каждой последовательности.У меня есть хэш для оценки лог-шансов %loscore, который содержит оценку базы в каждом месте в мотиве.Оценка лог-шансов рассчитывается путем суммирования ссылочных значений.Например, если таблица log-odds была

A 4 3 2
C 7 2 1
G 6 9 2
T 1 0 3

Оценка log-odds последовательности CAG будет 7+3+2=12.

В настоящий момент я считаю, что ошибка возникает из-за способа, которым я разделяю цепочки ДНК для помещения в хэш массивов.Как я уже говорил ранее, если вы хотите весь код, чтобы вы могли копировать-вставить, я могу предоставить его.Я думаю, что решение довольно простое, и мне просто нужно, чтобы кто-то указал мне правильное направление.Любая помощь приветствуется, и я могу уточнить, как возникнут вопросы.Также приветствуются любые советы, которые могут помочь мне опубликовать более сжатые вопросы (я знаю, что этот вопрос слишком длинный, я просто хочу предоставить достаточно справочной информации).

1 Ответ

0 голосов
/ 26 марта 2019

Вот код, который я использую для перебора `% HoA.Он рассчитывает оценку лог-шансов для каждой последовательности, затем обрабатывает каждую последовательность, чтобы найти максимальную оценку для каждой последовательности.Большое спасибо всем за помощь!

foreach $id (keys %HoA)
{
    for my $pos1 (0..length($HoA{$id})-1)
    {
        for my $pos2 ($pos1..$pos1+($width-1))
        {
            for my $base (qw( A C G T))
            {
                if ($HoA{$id}[$pos2] eq $base)
                {
                    for my $pos3 (0..$width-1)
                    {
                        $loscore{$id} += $logodds{$base}[$pos3];

                        if ($loscore{$id} > $maxscore{$id})
                        {
                            $maxscore{$id} = $loscore{$id};
                        }
                    }
                }
                elsif ( ! defined $HoA{$id}[$pos2])
                {
                    print "$pos2\n";
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...