连接外显子序列,并在两者之间插入Ns

时间:2019-07-03 17:36:34

标签: python r bash merge sequence

所以我想对带有外显子序列的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.X.X”的名称,外显子的编号和字符串的长度组成。

我要实现的目标如下:

>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 Ns 1和2。在第二种情况下,在外显子1和2之间引入31 Ns的字符串,在外显子2和3之间引入16 Ns的字符串。

这基本上是我的主要且棘手的任务。是否有人知道或提出基于Python,BASH,AWK,R,Perl或类似版本的解决方案?

我一直在试图解决这个问题,但是在合并它们的同时,我无法达成一个很好的通用解决方案来循环遍历相同的记录...

非常感谢。

1 个答案:

答案 0 :(得分:0)

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;
    }
}

它逐行读取文件。最后处理的笔录ID及其部分(以及上一个外显子)也存储在变量中。如果遇到标题,则检查是否有新的成绩单开始。如果是,我们可以忘记上一个外显子,否则我们将打印出包含成绩单,上一个部分和实际部分的标题。

如果我们阅读外显子行,如果有一个外显子要打印(这意味着我们不在笔录的第一部分),我们将检查新旧外显子的长度,选择较长的外显子,然后输出外显子和N。然后,我们应该记住外显子,以便进一步处理,如果同一笔录的另一部分也要遵循。