#!/usr/bin/perl -w use strict; use Bio::AlignIO; my $dir = shift @ARGV || die "need a directory"; my $ext = "\.pep\.aln"; my @aln_array; opendir(DIR, $dir) || die $!; for my $file ( readdir(DIR) ) { if( $file =~ /$ext$/ ) { my $in = Bio::AlignIO->new(-format => 'fasta', -file => "$dir/$file"); if( my $aln = $in->next_aln ) { # do something with aln push @aln_array, $aln; } } } # print the type of object that I have # print ref($object), "\n"; my %seqs; my $i = 0; for my $aln ( @aln_array ) { my $trimmed_aln = $aln->remove_gaps; for my $seq ( $trimmed_aln->each_seq ) { my $id; my $seqid = substr($seq->display_id,0,1); if( $seqid eq 'b' ) { $id = 'ecoli'; } elsif( $seqid eq 'y' ) { $id = 'yersinia'; } elsif( $seqid eq 'S' ) { $id = 'salmonella'; } else { warning("seqid is $seqid for ",$seq->display_id, "\n"); $id = 'unknown'; } $seqs{$id} .= $seq->seq; } } my $newaln = Bio::SimpleAlign->new; for my $id ( keys %seqs ) { $newaln->add_seq( Bio::LocatableSeq->new(-display_id => $id, -seq => $seqs{$id}) ); } my $out = Bio::AlignIO->new(-file => ">concatenated_aln.nex", -format => 'nexus', -show_symbols => 0, # for mrbayes' happiness -show_endblock => 0, # ditto ); $out->write_aln($newaln);