2016-05-02 24 views
2

使用我的(相當)基本的編碼技巧,我已經組合了一個腳本來解析一個對齊的多fasta文件(多序列比對)並提取兩個指定列之間的所有數據。從多個序列比對中提取和連接外顯子

use Bio::SimpleAlign; 
use Bio::AlignIO; 
$str = Bio::AlignIO->new(-file => $inputfilename, -format => 'fasta'); 
$aln = $str->next_aln(); 
$mini = $aln->slice($array[0], $array[1]); 
$out = Bio::AlignIO->new(-file => $array[3], -format => 'fasta'); 
$out->write_aln($mini); 

問題我是,我希望能夠從同一對準切片多個區域,然後寫一個OUTFILE之前加入這些地區。 併發症是我想提供一個文件的座標列表,其中每行包含兩個或多個座標之間的數據應提取和加入。

下面是一個例子統籌文件

ORF1, 10, 50, exon1 # The above line should produce a slice between columns 10-50 and write to an outfile 
ORF2, 70, 140, exon1 
ORF2, 190, 270, exon2 
ORF2, 500, 800, exon3 # Data should be extracted between the ranges specified here and in the above two lines and then joined (side by side) to produce the outfile. 
ORF3, 1200, 1210, exon1 
etc etc 

這裏是對齊的FASTA文件

\>Sample1 
ATGGCGACCGTGCACTACTCCCGCCGACCTGGGACCCCGCCGGTCACCCTCACGTCGTCC 
CCCAGCATGGATGACGTTGCGACCCCCATCCCCTACCTACCCACATACGCCGAGGCCGTG 
GCAGACGCGCCCCCCCCTTACAGAAGCCGCGAGAGTCTGGTGTTCTCCCCGCCTCTTTTT 
CCTCACGTGGAGAATGGCACCACCCAACAGTCTTACGATTGCCTAGACTGCGCTTATGAT 
GGAATCCACAGACTTCAGCTGGCTTTTCTAAGAATTCGCAAATGCTGTGTACCGGCTTTT 
TTAATTCTTTTTGGTATTCTCACCCTTACTGCTGTCGTGGTCGCCATTGTTGCCGTTTTT 
CCCGAGGAACCTCCCAACTCAACTACATGA 
\>Sample2 
ATGGCGACCGTGCACTACTCCCGCCGACCTGGGACCCCGCCGGTCACCCTCACGTCGTCC 
CCCAGCATGGATGACGTTGCGACCCCCATCCCCTACCTACCCACATACGCCGAGGCCGTG 
GCAGACGCGCCCCCCCCTTACAGAAGCCGCGAGAGTCTGGTGTTCTCCCCGCCTCTTTTT 
CCTCACGTGGAGAATGGCACCACCCAACAGTCTTACGATTGCCTAGACTGCGCTTATGAT 
GGAATCCACAGACTTCAGCTGGCTTTTCTAAGAATTCGCAAATGCTGTGTACCGGCTTTT 
TTAATTCTTTTTGGTATTCTCACCCTTACTGCTGTCGTGGTCGCCATTGTTGCCGTTTTT 
CCCGAGGAACCTCCCAACTCAACTACATGA 

我認爲應該有解決的一個相當簡單的方式的(小)例如這個問題可能會使用第一列中的信息與外顯子編號配對,但我不能在我的生活中找出如何做到這一點。

任何人都可以幫我嗎?

回答

1
  1. 您發佈的對齊的fasta文件(至少出現在stackoverflow網頁上)沒有編譯。根據https://en.wikipedia.org/wiki/FASTA_format,描述行應以>開頭,而不是\>

  2. 請務必使用use strict; use warnings;運行所有Perl程序。這將有助於調試。

  3. 您還沒有填充@array。因此,你可以期望得到錯誤這樣的:

    Use of uninitialized value $start in pattern match (m//) at perl-5.24.0/lib/site_perl/5.24.0/Bio/SimpleAlign.pm line 1086, <GEN0> line 16. 
    Use of uninitialized value $start in concatenation (.) or string at perl-5.24.0/lib/site_perl/5.24.0/Bio/SimpleAlign.pm line 1086, <GEN0> line 16. 
    
    ------------- EXCEPTION: Bio::Root::Exception ------------- 
    MSG: Slice start has to be a positive integer, not [] 
    STACK: Error::throw 
    STACK: Bio::Root::Root::throw perl-5.24.0/lib/site_perl/5.24.0/Bio/Root/Root.pm:444 
    STACK: Bio::SimpleAlign::slice perl-5.24.0/lib/site_perl/5.24.0/Bio/SimpleAlign.pm:1086 
    STACK: fasta.pl:26 
    

一旦指定合理的值,例如,

@array = (1,17); 

...你會得到更合理的結果:

$ perl fasta.pl 
>Sample1/1-17 
ATGGCGACCGTGCACTA 
>Sample2/1-17 
ATGGCGACCGTGCACTA 

HTH!