Perl-программа для имитации синтеза РНК - PullRequest
3 голосов
/ 06 ноября 2010

Ищу предложения о том, как подойти к моему домашнему заданию по программированию на Perl, чтобы написать программу синтеза РНК. Я подвел итог и обрисовал в общих чертах программу ниже. В частности, я ищу отзывы о блоках ниже (я буду номер для справки). Я прочитал до главы 6 «Элементы программирования на Perl» Эндрю Джонсона (отличная книга). Я также читал страницы-страницы perlfunc и perlop, где ничего не указывалось, с чего начать.

Описание программы: Программа должна прочитать входной файл из командной строки, перевести его в РНК и затем транскрибировать РНК в последовательность заглавных букв из одной буквы.

  1. Принять файл с именем в командной строке

    здесь я буду использовать оператор <>

  2. Убедитесь, что файл содержит только acgt или die

    if ( <> ne [acgt] ) { die "usage: file must only contain nucleotides \n"; }  
    
  3. Транскрибировать ДНК в РНК (каждый A заменен на U, T заменен на A, C заменен на G, G заменен на C)

    не уверен, как это сделать

  4. Возьмите эту транскрипцию и разбейте ее на 3 «кодона», начиная с первого вхождения «AUG»

    не уверен, но я думаю, что именно здесь я начну% хеш-переменных?

  5. Возьмите 3-символьные «кодоны» и дайте им однобуквенный символ (заглавное однобуквенное название аминокислоты)

    Назначьте ключу значение, используя (здесь 70 возможностей, поэтому я не уверен, где хранить или как получить к нему доступ)

  6. Если обнаружен пробел, запускается новая строка и процесс повторяется

    не уверен, но мы можем предположить, что разрывы кратны тройкам.

  7. Правильно ли я подхожу к этому? Есть ли какая-то функция Perl, которую я пропускаю, которая может упростить основную программу?

Примечание

Должна быть автономной программой (сохраненные значения для имен и символов кодонов).

Всякий раз, когда программа читает кодон, у которого нет символа, это пробел в РНК, она должна начинать новую строку вывода и начинаться со следующего вхождения «AUG». Для простоты можно предположить, что промежутки всегда кратны тройкам.

Прежде чем потратить дополнительные часы на исследования, я надеюсь получить подтверждение, что я выбрал правильный подход. Спасибо, что нашли время, чтобы прочитать и поделиться своим опытом!

Ответы [ 3 ]

5 голосов
/ 06 ноября 2010

1. here I will use the <> operator

Хорошо, вы планируете читать файл построчно.Не забывайте chomp каждую строку по ходу, иначе вы получите символы новой строки в вашей последовательности.


2. Check to make sure the file only contains acgt or die

if ( <> ne [acgt] ) { die "usage: file must only contain nucleotides \n"; }

В цикле while оператор <> помещает прочитанную строку в специальную переменную $_, если вы не назначите ее явно (my $line = <>).

В приведенном выше коде вы 'читаем одну строку из файла и отбрасываем ее.Вам нужно сохранить эту строку.

Кроме того, оператор ne сравнивает две строки, а не одну строку и одно регулярное выражение.Здесь вам понадобится оператор !~ (или оператор =~ с отрицательным символьным классом [^acgt]. Если вам нужен тест без учета регистра, посмотрите на флаг i для соответствия регулярному выражению.


3. Transcribe the DNA to RNA (Every A replaced by U, T replaced by A, C replaced by G, G replaced by C).

Как сказал GWW, проверьте свою биологию. T-> U - единственный шаг в транскрипции. Вы найдете оператор tr (транслитерация) полезнымздесь.


4. Take this transcription & break it into 3 character 'codons' starting at the first occurance of "AUG"

not sure but I'm thinking this is where I will start a %hash variables?

Я бы использовал здесь буфер. Определите скаляр вне цикла while(<>). Используйте indexчтобы соответствовать «AUG». Если вы не нашли его, поместите последние две базы в этот скаляр (вы можете использовать substr $line, -2, 2 для этого). На следующей итерации цикла добавьте (с .=) строку кэти две базы и , а затем снова проверяют «AUG». Если вы получите удар, вы будете знать, где, так что вы можете пометить место и начать перевод.5. Take the 3 character "codons" and give them a single letter Symbol (an uppercase one-letter amino acid name)

Assign a key a value using (there are 70 possibilities here so I'm not sure where to store or how to access)

Опять же, как сказал GWW, создайте хеш-таблицу:

%codons = ( AUG => 'M', ...).

Затем вы можете использовать (например.) split построитьмассив текущей строки, которую вы изучаете, строите кодоны по три элемента за раз и извлекайте правильный код аминокислоты из хеш-таблицы.


6.If a gap is encountered a new line is started and process is repeated

not sure but we can assume that gaps are multiples of threes.

Смотри выше.Вы можете проверить наличие пробела с помощью exists $codons{$current_codon}.


7. Am I approaching this the right way? Is there a Perl function that I'm overlooking that can simplify the main program?

Вы знаете, глядя на вышесказанное, это кажется слишком сложным.Я построил несколько строительных блоков;подпрограммы read_codon и translate: я думаю, что они очень помогают логике программы.

Я знаю, что это домашнее задание, но я полагаю, что это может помочь вам почувствовать другие возможные подходы:

use warnings; use strict;
use feature 'state';


# read_codon works by using the new [state][1] feature in Perl 5.10
# both @buffer and $handle represent 'state' on this function:
# Both permits abstracting reading codons from processing the file
# line-by-line.
# Once read_colon is called for the first time, both are initialized.
# Since $handle is a state variable, the current file handle position
# is never reset. Similarly, @buffer always holds whatever was left
# from the previous call.
# The base case is that @buffer contains less than 3bp, in which case
# we need to read a new line, remove the "\n" character,
# split it and push the resulting list to the end of the @buffer.
# If we encounter EOF on the $handle, then we have exhausted the file,
# and the @buffer as well, so we 'return' undef.
# otherwise we pick the first 3bp of the @buffer, join them into a string,
# transcribe it and return it.

sub read_codon {
    my ($file) = @_;

    state @buffer;
    open state $handle, '<', $file or die $!;

    if (@buffer < 3) {
        my $new_line = scalar <$handle> or return;
        chomp $new_line;
        push @buffer, split //, $new_line;
    }

    return transcribe(
                       join '', 
                       shift @buffer,
                       shift @buffer,
                       shift @buffer
                     );
}

sub transcribe {
    my ($codon) = @_;
    $codon =~ tr/T/U/;
    return $codon;
}


# translate works by using the new [state][1] feature in Perl 5.10
# the $TRANSLATE state is initialized to 0
# as codons are passed to it, 
# the sub updates the state according to start and stop codons.
# Since $TRANSLATE is a state variable, it is only initialized once,
# (the first time the sub is called)
# If the current state is 'translating',
# then the sub returns the appropriate amino-acid from the %codes table, if any.
# Thus this provides a logical way to the caller of this sub to determine whether
# it should print an amino-acid or not: if not, the sub will return undef.
# %codes could also be a state variable, but since it is not actually a 'state',
# it is initialized once, in a code block visible form the sub,
# but separate from the rest of the program, since it is 'private' to the sub

{
    our %codes = (
        AUG => 'M',
        ...
    );

    sub translate {
        my ($codon) = @_ or return;

        state $TRANSLATE = 0;

        $TRANSLATE = 1 if $codon =~ m/AUG/i;
        $TRANSLATE = 0 if $codon =~ m/U(AA|GA|AG)/i;

        return $codes{$codon} if $TRANSLATE;
    }
}
3 голосов
/ 06 ноября 2010

Я могу дать вам несколько советов по нескольким вашим пунктам.

Я думаю, что ваша первая цель должна состоять в том, чтобы проанализировать файл символ за символом, убедиться, что каждый из них действителен, сгруппировать их в наборы из трех нуклеотидов и затем работать над другими вашими целями.

Я думаю, что ваша биология тоже немного отличается, когда вы транскрибируете ДНК в РНК, вам нужно подумать о том, какие нити задействованы. Вам может не понадобиться «дополнять» свои базы на этапе транскрипции.

2. Вы должны проверить это как свой анализ файла символ за символом.

3. Вы можете сделать это с помощью цикла и некоторых операторов if или хеша

4. Возможно, это можно сделать с помощью счетчика, когда вы читаете файл символ за символом. Так как вам нужно вставить пробел после каждого третьего символа.

5. Это было бы хорошим местом для использования хэша, основанного на таблице кодонов аминокислот.

6. Вам придется искать символ пробела при разборе файла. Это, кажется, противоречит вашему требованию № 2, так как программа говорит, что ваш текст может содержать только ATGC.

Существует множество функций perl, которые могут упростить это. Существуют также модули Perl, такие как Bioperl. Но я думаю, что использование некоторых из них может нанести ущерб цели вашего задания.

1 голос
/ 06 ноября 2010

Посмотрите на BioPerl и , просмотрите исходные модули , чтобы узнать, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...