[Bioperl-l] Question on Tree : Last common ancestor / Internal Nodes

Himanshu Ardawatia himanshu.ardawatia at bccs.uib.no
Tue Jan 9 23:08:18 EST 2007


Hi,

I am using version 1.4 . With this version, I run the script (the one you
sent) and get the following error:
Use of uninitialized value in pattern match (m//) at tree.pl line 7.

-------------------- WARNING ---------------------
MSG: Must provide a valid array reference for -nodes
---------------------------------------------------
Can't call method "id" on an undefined value at tree.pl line 9.


I then installed version 1.5.2. With this vesion I get the following error:

And I get the same error as above .

Which method should I use : 'id()' or 'internal_id()' . I get the same error
using any of the methods.

Thanks
Himanshu
script :
#!/usr/bin/perl -w

use strict;
use Bio::TreeIO;
my $tree = Bio::TreeIO->new(-format => 'newick', -fh => \*DATA)->next_tree;

my @nodes = grep { $_->id =~ /c|d|f/ } $tree->get_nodes;
my $lca = $tree->get_lca(@nodes);
print "lca is ",$lca->id, " for ", join(",",map { $_->id } @nodes), "\n";

@nodes = grep { $_->id =~ /a|z/ } $tree->get_nodes;
$lca = $tree->get_lca(@nodes);
print "lca is ",$lca->id, " for ", join(",",map { $_->id } @nodes), "\n";

__DATA__
(a,((c,d)z,(e,f)y)x)root;
---------------------------------------------------
On 1/9/07, Sendu Bala <bix at sendu.me.uk> wrote:
>
> Himanshu Ardawatia wrote:
> > Hi,
> >
> > I am trying the available bioperl script (attached below), and as I
> > see it seems to give (or not give at all) strange results:
>
> What version of Bioperl are you using? With 1.5.2 I don't see any
> problems except user-error. I've noted the results I get below.
>
>
> > Input tree: __DATA__ (a,((c,d)z,(e,f)y)x)root;
> >
> > Output : Use of uninitialized value in pattern match (m//) at
> > try_tree_new.pl line 9. lca is x for c,d,f Use of uninitialized value
> > in pattern match (m//) at try_tree_new.pl line 18. Use of
> > uninitialized value in print at try_tree_new.pl line 25. lca is  for
> > a,z
>
> lca is x for c,d,f
> lca is root for a,z
>
>
> > However, here we can see that actually, 'lca' for 'e' and 'f' should
> > be 'y' and 'lca' for 'c' and 'd' should be 'z' .
>
> What do you mean? Your script asks the lca of c,d,f and a,z, not e,f or
> c,d.
>
>
> > In another case, if my input tree is : __DATA__
> > (a,((c,d)D0L0=0+0,(e,f)D0L1=1+0)D0L2=1+1)D1L0=0+0; (where I have
> > replaced 'x', 'y', 'z' and 'root' internal nodes with some other
> > values which are important for me)
> >
> > I get the Output: Use of uninitialized value in pattern match (m//)
> > at try_tree_new.pl line 9. lca is D0L2=1+1 for c,d,f Use of
> > uninitialized value in pattern match (m//) at try_tree_new.pl line
> > 18. lca is a for a
>
> lca is D0L2=1+1 for c,d,f
> lca is a for a
>
>
> > Here the last line is changed ' lca is a for a' as comapred to the
> > previous result.
> >
> > I wonder why this change.....
>
> Your script asks for the lca of a,z but the tree no longer has a node
> 'z'. So you ask for the lca of 'a', which is 'a'.
>
>
> > If a use a completely different tree :
> >
> > Input: __DATA_
> > ((48355,(21337,65453)D0L0=0+0)D0L1=1+0,(38243,18116)D0L2=1+1)D1L0=0+0;
> >
> >
> > I do not get any result in the output at all...
> >
> > Output : Use of uninitialized value in pattern match (m//) at
> > try_tree_new.pl line 9. Can't call method "id" on an undefined value
> > at try_tree_new.pl line 17.
>
> Can't call method "id" on an undefined value at try_tree_new.pl line 14.
>
>
> > Can anyone suggest why these differences
>
> Again, your script is asking for nodes that aren't in the tree, so of
> course it isn't going to work.
>
>
> > and how can I obtain 'internal node ids' (eg. in this case 'D1L0=0+0'
> > etc. for each leaf seperately ?
>
> You'll want to use the methods get_leaf_nodes() and internal_id()
> (though you almost certainly don't really want the internal id and
> should be using the human-readable id id() instead).
>
>
> In Bioperl 1.5.2 your code can be written as the much simpler:
>
> #!/usr/bin/perl -w
>
> use strict;
> use Bio::TreeIO;
> my $tree = Bio::TreeIO->new(-format => 'newick', -fh =>
> \*DATA)->next_tree;
>
> my @nodes = grep { $_->id =~ /c|d|f/ } $tree->get_nodes;
> my $lca = $tree->get_lca(@nodes);
> print "lca is ",$lca->id, " for ", join(",",map { $_->id } @nodes), "\n";
>
> @nodes = grep { $_->id =~ /a|z/ } $tree->get_nodes;
> $lca = $tree->get_lca(@nodes);
> print "lca is ",$lca->id, " for ", join(",",map { $_->id } @nodes), "\n";
>
> __DATA__
> (a,((c,d)z,(e,f)y)x)root;
>


More information about the Bioperl-l mailing list