[Bioperl-l] clustalw

Sendu Bala bix at sendu.me.uk
Tue Mar 6 08:33:59 EST 2007

Luba Pardo wrote:
> Hello,
> I tried to post this question yesterday (sorry if you get the email several
> times).

We did. Please only send one email and trust that it will make it to the 

> I am trying to run a script for Clustalw based on few examples. I always get
> an error:
> EXCEPTION: Bio::Root::Exception -------------
> MSG: Bad input data (sequences need an id ) or less than 2 sequences in
> ARRAY(0x8861280) !
> STACK: Error::throw
> STACK: Bio::Root::Root::throw
> /usr/lib/perl5/site_perl/5.8.1/Bio/Root/Root.pm:359
> STACK: Bio::Tools::Run::Alignment::Clustalw::align
> /usr/lib/perl5/site_perl/5.8.1/Bio/Tools/Run/Alignment/Clustalw.pm:484
> STACK: clustal1.pl:17

As the Exception message states, you probably didn't supply 2 or more 
sequences. See how many elements @seq_array has after your while loop. 
What exactly is 'clustalw.fa'? Is it really a plain, unaligned 
multi-fasta file with 2 or more sequences in it?

>  or
> EXCEPTION: Bio::Root::NotImplemented -------------
> MSG: Abstract method "Bio::Tools::Run::WrapperBase::run" is not implemented
> by package Bio::Tools::Run::Alignment::Clustalw.
> This is not your fault - author of Bio::Tools::Run::Alignment::Clustalw
> should be blamed!

You're using code from the synopsis of the 'live' (latest, CVS-only) 
version of Bio::Tools::Run::Alignment::Clustalw but do not have that 
version installed. The run() method was only added recently. If you 
actually want the run() method, update the Clustalw module from CVS.


> BEGIN {$ENV{CLUSTALDIR} = '/home/luba/bin/clustalx1.82.linux/';}
> use Bio::SeqIO;
> use Bio::Tools::Run::Alignment::Clustalw;
> use Bio::SimpleAlign;
> use Bio::AlignIO;
> #use strict;
> use warnings;
> my @params = ('ktuple' => 2, 'matrix' => 'BLOSUM');
>   my $factory = Bio::Tools::Run::Alignment::Clustalw->new(@params);
>   my $str = Bio::SeqIO->new(-file=> 'clustalw.fa ', '-format' => 'Fasta');
>   my @seq_array =();
>   while ( my $seq = $str->next_seq() ) {push (@seq_array, $seq) ;}
>   my $seq_array_ref = \@seq_array;
>   my $aln = $factory->align($seq_array_ref);
>    # Get a tree of the sequences
>   $tree = $factory->tree(\@seq_array);
>   # Get both an alignment and a tree
>   ($aln, $tree) = $factory->run(\@seq_array);
>   # Do a footprinting analysis on the supplied sequences, getting back the
>   # most conserved sub-alignments
>   my @results = $factory->footprint(\@seq_array);
>   foreach my $result (@results) {
>     print $result->consensus_string, "\n";
>   }

You need to learn to read and understand the synopsis code before trying 
to use it. The synopsis code usually isn't intended to be used 
whole-sale. Rather, as in this case, it demonstrates a few useful things 
that might not make sense all in the same script. So there's no need for 
you to get an alignment with the align() method, a tree with the tree() 
method and then get the alignment and tree again with the run() method. 
You also don't need to do footprinting with footprint() unless you're 
actually interested in footprinting!

tree() and footprint() won't work for you because, again, those are 
recent additions to the module. Upgrade from CVS if you really want to 

More information about the Bioperl-l mailing list