handling nexus files

View: New views
2 Messages — Rating Filter:   Alert me  

handling nexus files

by Denzel Li :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hello all:
Does bioperl support functions for handling nexus files? More specifically,
I need two functions, 1) combine multiple nexus files into one, 2) split a
nexus files into multiple nexus files. For example,
given the following two files  (file1.nex, file2.nex), is there function to
combine them into one file as shown in "combinedFile.nex", or to split
"combinedFile.nex" into two files (file1.nex, file2.nex).

------------------------------
# file1.nex
begin data;
  dimensions ntax=2 nchar=3
b1 GGG
b2 GGT
;end;
---------------------------------
# file2.nex
begin data;
  dimensions ntax=2 nchar=3
b1 AAA
b2 AAT
;end;
-------------------------------

# combinedFile.nex
begin data;
  dimensions ntax=2 nchar=6
[alignment from file1.nex]
b1 GGG
b2 GGT
[alignment from file2.nex]
b1 AAA
b2 AAT
;end;

begin sets;
charset a1=1-3;
charset a2=4-6;
end;
--------------------------------
Any suggestion is highly appreciated. Thank you.

Best,
Denzel
_______________________________________________
Bioperl-l mailing list
Bioperl-l@...
http://lists.open-bio.org/mailman/listinfo/bioperl-l

Re: handling nexus files

by Jason Stajich-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

you can manipulate the alignments to do this - so see what you can do  
with Bio::Align objects like Bio::SimpleAlign which is what you get  
when parsing with Bio::AlignIO.

The concatenation problem basically requires concatenating the data in  
the sequence objects.

Here is really basic solution - you'd want to add some error checking  
in there for consistency of data, all IDs present in all files, etc.

http://gist.github.com/202528

use Bio::AlignIO;
use Bio::SimpleAlign;
use strict;
my %seqs;
for my $file ( @ARGV ) {
  my $in = Bio::AlignIO->new(-format=> 'nexus', -file => $file);
   if ( my $aln = $in->next_aln ) {
    for my $seq ( $aln->each_seq ) {
    $seqs{$seq->display_id} .= $seq->seq;
   }
  }
}

my $newaln = Bio::SimpleAlign->new;
for my $id ( keys %seqs ) {
  $newaln->add_seq(Bio::LocatableSeq->new(-id=> $id,-seq=>$seqs{$id}));
}
my $out = Bio::AlignIO->new(-format => 'nexus');
$out->write_aln($newaln);

-jason
On Oct 5, 2009, at 11:35 AM, Denzel Li wrote:

> Hello all:
> Does bioperl support functions for handling nexus files? More  
> specifically,
> I need two functions, 1) combine multiple nexus files into one, 2)  
> split a
> nexus files into multiple nexus files. For example,
> given the following two files  (file1.nex, file2.nex), is there  
> function to
> combine them into one file as shown in "combinedFile.nex", or to split
> "combinedFile.nex" into two files (file1.nex, file2.nex).
>
> ------------------------------
> # file1.nex
> begin data;
>  dimensions ntax=2 nchar=3
> b1 GGG
> b2 GGT
> ;end;
> ---------------------------------
> # file2.nex
> begin data;
>  dimensions ntax=2 nchar=3
> b1 AAA
> b2 AAT
> ;end;
> -------------------------------
>
> # combinedFile.nex
> begin data;
>  dimensions ntax=2 nchar=6
> [alignment from file1.nex]
> b1 GGG
> b2 GGT
> [alignment from file2.nex]
> b1 AAA
> b2 AAT
> ;end;
>
> begin sets;
> charset a1=1-3;
> charset a2=4-6;
> end;
> --------------------------------
> Any suggestion is highly appreciated. Thank you.
>
> Best,
> Denzel
> _______________________________________________
> Bioperl-l mailing list
> Bioperl-l@...
> http://lists.open-bio.org/mailman/listinfo/bioperl-l

--
Jason Stajich
jason.stajich@...
jason@...

_______________________________________________
Bioperl-l mailing list
Bioperl-l@...
http://lists.open-bio.org/mailman/listinfo/bioperl-l