Конкатенация последовательностей экзонов и вставка Ns между - PullRequest
1 голос
/ 03 июля 2019

, поэтому я хочу выполнить несколько сложную задачу с файлом FASTA с последовательностями экзонов, такими как:

>MSTRG.1.1_1_30
AAAACGGAGGACCAAGCCGTTTGCCGTACG
>MSTRG.1.1_2_20
CCCGAAGGGCGTTAGTGAGC
>MSTRG.2.1_1_30
ACGGGAGCGTTGTCGACCGGTTGCGAGCGT
>MSTRG.2.1_2_10
AACGGGACCT
>MSTRG.2.1_3_15
AACGTTTGCGTCTCT

Как видно, у меня есть две расшифровки, называемые MSTRG.1.1 и MSTRG.2.1.Первый транскрипт имеет два экзона, первый называется MSTRG.1.1_1_30 и имеет длину 30 букв.Второй экзон (фрагмент) состоит из 20 букв.Напротив, другой транскрипт имеет три экзона, по 30, 10 и 15 букв в каждом.

Есть еще много транскриптов и более 3 экзонов, максимум до 20, более или менее.

Как видите, идентификатор последовательности букв состоит из имени транскрипта "MSTRG.XX", нумерации экзона и длины строки.

Что я хочудля достижения является следующее:

>MSTRG.1.1_1_2
AAAACGGAGGACCAAGCCGTTTGCCGTACGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCCGAAGGGCGTTAGTGAGC
>MSTRG.2.1_1_2
ACGGGAGCGTTGTCGACCGGTTGCGAGCGTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAACGGGACCT
>MSTRG.2.1_2_3
AACGGGACCTNNNNNNNNNNNNNNNNAACGTTTGCGTCTCT

Некоторое объяснение:

Я хочу объединить все последовательные экзоны в одном транскрипте, поэтому для транскрипта 1, поскольку есть два экзона, только один объединенпоследовательность, полученная в результате объединения экзонов 1 и 2. Для транскрипта 2 результатом будут две комбинации: экзоны 1 и 2 и экзоны 2 и 3 и т. д., в случае существования большего количества экзонов, чтобы получить n-1 комбинаций, где n - количество экзонов.

Помимо этого, я хочу ввести строку Ns между двумя комбинированными экзонами, длина которой равна самому длинному экзону меня.средняя пара + 1. Скажем, в первом случае вводим строку из 31 Нс между экзоном 1 и 2. Тогда как во втором случае вводим строку из 31 Нс между экзоном 1 и 2 и строку из 16 Нс между экзоном2 и 3.

Это в основном моя главная и хитрая задача.Кто-нибудь знает или придумал решение, основанное на Python, BASH, AWK, R, Perl или аналогичном?

Я пытался решить эту проблему, но не смог найти хорошее общее решение для обхода одного и того жестенограммы при их объединении ...

Большое спасибо.

1 Ответ

0 голосов
/ 03 июля 2019

Perl решение:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

my $transcript;
my $part;
my $exon;
while (<>) {
    chomp;
    if (/^>(.*?\.[0-9]+\.[0-9]+)_([0-9]+)/) {
        my ($new_transcript, $new_part) = ($1, $2);
        if ($transcript && $transcript eq $new_transcript) {
            say ">$transcript\_$part\_$new_part";

        } else {
            undef $exon;
        }

        $transcript = $new_transcript;
        $part = $new_part;

    } else {
        my $new_exon = $_;
        if ($exon) {
            my $max_length = length $exon;
            $max_length = length $new_exon if length $new_exon > $max_length;
            say $exon, 'N' x ++$max_length, $new_exon;
        }
        $exon = $new_exon;
    }
}

Он читает файл построчно. Последний обработанный идентификатор транскрипта и его часть (и предыдущий экзон тоже) хранятся в переменных. Если мы сталкиваемся с заголовком, мы проверяем, начинается ли новый транскрипт. Если да, мы можем забыть предыдущий экзон, в противном случае мы печатаем заголовок, содержащий стенограмму, предыдущую часть и фактическую часть.

Если мы читаем строку экзона, если есть экзон для печати (что означает, что мы не в первой части стенограммы), мы проверяем длину старого и нового экзонов, выбираем более длинный и выводим экзоны и н. Затем мы запоминаем экзон для дальнейшей обработки, если последует другая часть того же стенограммы.

...