Программа Perl печатает полные последовательности файлов .fasta в файл, но пытается достичь определенного количества нуклеотидов по отношению к генам

Пока мне удалось немного лучше понять Perl, что является облегчением, и я хочу поблагодарить вас, ребята. В настоящее время я все еще работаю над другим аспектом, где мне нужно прочитать файл .fasta и найти все нуклеотиды G и C, а затем создать файл с разделителями табуляции.

Это были мои сообщения за последние несколько дней в хронологическом порядке:

  1. Как сделать Я усредняю ​​значения столбцов из данных, разделенных табуляцией ... (решено)
  2. Почему я не вижу вычисленных результатов в моем выводе файл? (решено)
  3. Использование файла .fasta для вычисления относительного содержания последовательностей < / а>
  4. Чтение последовательностей .fasta для извлечения нуклеотидные данные, а затем ... (сообщение перед этим)

Последний запрос все еще прорабатывается, но я добился некоторого прогресса.

Немного фона, файл .fasta читается примерно так:

>label
sequence
>label
sequence
>label
sequence

Я не уверен, как открыть файл .fasta, поэтому я не уверен, какие метки к каким относятся, но я знаю, что гены должны быть помечены как gag, pol или env. Нужно ли мне открывать файл .fasta, чтобы знать, что я делаю, или я могу сделать это «вслепую», выбрав указанный выше формат?

Во всяком случае, текущий код у меня следующий:

#!/usr/bin/perl -w
# This script reads several sequences and computes the relative content of G+C of each sequence.

use strict; 

my $infile = "Lab1_seq.fasta";                               # This is the file path
open INFILE, $infile or die "Can't open $infile: $!";        # This opens file, but if file isn't there it mentions this will not open
my $outfile = "Lab1_SeqOutput.txt";             # This is the file's output
open OUTFILE, ">$outfile" or die "Cannot open $outfile: $!"; # This opens the output file, otherwise it mentions this will not open

my $sequence = ();  # This sequence variable stores the sequences from the .fasta file
my $GC = 0;         # This variable checks for G + C content

my $line;                             # This reads the input file one-line-at-a-time

while ($line = <INFILE>) {
    chomp $line;                      # This removes "\n" at the end of each line (this is invisible)

    if($line =~ /^\s*$/) {         # This finds lines with whitespaces from the beginning to the ending of the sequence. Removes blank line.
        next;

    } elsif($line =~ qr(^\s*\#/)) {        # This finds lines with spaces before the hash character. Removes .fasta comment
        next; 
    } elsif($line =~ /^>/) {           # This finds lines with the '>' symbol at beginning of label. Removes .fasta label
        next;
    } else {
        $sequence = $line;
    }

    $sequence =~ s/\s//g;               # Whitespace characters are removed
    print OUTFILE $sequence;
}

Теперь код печатает в текстовый файл всю последовательность без пробелов. Единственная проблема в том, что я не знаю, где последовательности начинались или заканчивались, поэтому я не уверен, какие последовательности применимы к каждому гену. Хотя кодон остановки / запуска должен дать мне указание. С учетом этого, как мне изменить / добавить в код, чтобы вычислить количество G + C в последовательностях, а затем распечатать их в файл с разделителями табуляции с именами генов, связанных с их соответствующим содержимым G / C ?

Я с нетерпением жду ответа от кого-то, кто может дать некоторые рекомендации, аналогичные приведенному выше коду, относительно того, как найти G / C и затем свести в таблицу соответствующие подсчеты.


person PkC    schedule 17.03.2012    source источник


Ответы (2)


Следующие ссылки могут быть полезны. Уже написано много кода, и Bio :: SeqIO и Bio :: Seq, похоже, обсуждаются довольно часто. Существует веб-сайт BioPerl, но я с ним не знаком. Там есть примеры кода и другая информация. Также полезен FAQ.

Вот образец из документации Bio :: SeqIO.

use Bio::SeqIO;

$in  = Bio::SeqIO->new(-file => "inputfilename" ,
                       -format => 'Fasta');
$out = Bio::SeqIO->new(-file => ">outputfilename" ,
                       -format => 'EMBL');

while ( my $seq = $in->next_seq() ) {
        $out->write_seq($seq);
}
person Chris Charley    schedule 18.03.2012

На самом деле я сам работаю с файлами FASTA. Итак, я чувствую твою боль.

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

>label1
sequence1
>label2
sequence2
>label3
sequence3
...

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

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

Как только у вас есть это, вам просто нужно пройтись по переформатированному файлу, захватить нужные фрагменты последовательности и перезапустить счетчик всякий раз, когда вы встречаетесь с новой меткой.

person MrGomez    schedule 17.03.2012
comment
Как бы вы порекомендовали это сделать? Следует ли мне удалить строку «если» (помеченную как удаление пустой строки)? Я также пытаюсь настроить этот счетчик, так как мне нужно G + C от каждого из 3 ярлыков ... Обнаружил трудности с этим. - person PkC; 18.03.2012
comment
@PkC Я рекомендую записывать метку, когда вы ее обнаруживаете, добавляя лишний \n при выполнении записи. Таким образом, вы получите последовательности с неповрежденной структурой маркировки и сможете продолжить выполнение других операций. Удачи тебе в этом. - person MrGomez; 18.03.2012
comment
Можете ли вы привести пример этого? Я продолжаю получать сообщения об ошибках аргументов, в которых говорится, что значения не являются числовыми и т. Д. - person PkC; 18.03.2012
comment
@PkC Да, но не для Perl, так как у меня минимальный опыт работы с этим языком. Если вы свободно владеете другими языками, такими как C ++, я создал библиотеку синтаксического анализа файлов FASTA как часть своего проекта здесь: code.google.com/p/molotov. Извините за разочарование. - person MrGomez; 18.03.2012
comment
Не беспокоиться. Я собираюсь заняться этим до завтра. Пока я выполнил 2 из 3 заданий. Это должен был быть Perl, который был «менее вероятным» языком программирования, по крайней мере, из того, что я слышал. Тем не менее, я очень благодарен за вашу помощь! Спасибо. - person PkC; 18.03.2012