[Bioperl-l] comparing phylogenies.

Zara Ghazoui zg105 at york.ac.uk
Thu Nov 4 10:27:32 EST 2004


Hi Jason,

I am not sure if the method below would work in my case for comparing 
phylogenies.

So
- Make a list of node names in Tree A which into a clade with 70% 
support (based on the code I posted before).
- Then find these nodes in Tree B (find_node method).
  - Find their LCA (get_lca method).
  - Then walk back down from the LCA (an internal node) and get all the 
tips (get_all_Descendents + the grep code posted below).
  - Check if there are any other taxa in the clade thus violating your 
requirement of identical clades.

Post your code that does parts of what you want and we can help point.  
Please post to the list so other people can learn from it too.


The reason being is that when I get all the descendents of the LCA in 
Tree B for a particular node, I will just get all the taxa provided that 
this particular node is an edge. Therefore the taxa would be the same 
since I have used the same species to build my 2 single gene phylogenies 
(TreeA and TreeB).

So I though instead of looking up all the nodes from Tree A in Tree B, I 
'll only look up the leafnodes. Also instead of going all the way down 
to the LCA in tree B, maybe I can just compare the descendents of the 
parents of that particular leafnode in Tree A and Tree B.  However I 
think this will only work for comparing the groupings that form the 
leaves of my tree.  So is there any way of doing this process 
recursively starting from the leaves i.e. Find leafnode X  in Tree B, 
look up its sister groups (the descendents of its parent) + compare with 
the sister groups of leafnode X in TreeA.  If similar move up Tree B 
doing this same process all the way to LCA in Tree B but if different 
then break saying these groupings are different.


Thanks lot for your help in advance.

Zara









#!/usr/bin/perl
use Bio::TreeIO;
use  Array::Compare ;

my $inputA = new Bio::TreeIO(-file => 
"/biol/people/zg105/ProSeqFasta/AgroBradRpalusMesoSinoBrumelCauloRleg_stuff/aligned_files/test/1.phb",-format 
=> "newick");
my $treeA = $inputA->next_tree;

my $inputB = new Bio::TreeIO (-file => 
"/biol/people/zg105/ProSeqFasta/AgroBradRpalusMesoSinoBrumelCauloRleg_stuff/aligned_files/test/10.phb",-format 
=> "newick");
my $treeB = $inputB ->next_tree;

my $array_comp = Array::Compare->new;
my @TreeA_leaves = grep {$_-> is_Leaf() && $_->ancestor->bootstrap > 700 
} $treeA->get_nodes;

for my $TreeAleaf (@TreeA_leaves) {
    my $TreeAleaf_parent  = $TreeAleaf ->ancestor;
    my @TreeA_parent_descendents = $TreeAleaf_parent 
->get_all_Descendents();
    my $TreeAleafname = $TreeAleaf ->id;
    print ("Node in TreeA is $TreeAleafname \n");
    for my $TreeA_parent_descendent (@TreeA_parent_descendents){
    $TreeA_DescendentName = $TreeA_parent_descendent ->id ;
    push (@TreeA_DescendentNames ,$TreeA_DescendentName);
    print ("Descendents of this node  in TreeA are 
$TreeA_DescendentName\n");
    }

    my @TreeB_leaves = grep {$_-> is_Leaf() && $_->ancestor->bootstrap > 
700 } $treeB->get_nodes;
    for my $TreeBleaf (@TreeB_leaves){
    if ($TreeBleaf ->id eq $TreeAleafname ){
        my $TreeBleaf_parent  = $TreeBleaf ->ancestor;
        my @TreeB_parent_descendents  = 
$TreeBleaf_parent->get_all_Descendents();
        for my $TreeB_parent_descendent (@TreeB_parent_descendents){
              $TreeB_DescendentName = $TreeB_parent_descendent ->id ;
        push (@TreeB_DescendentNames ,$TreeA_DescendentName);
        print ("Descendents of this node  in TreeB are 
$TreeB_DescendentName \n");
        unless( grep{ $_->id eq $TreeB_DescendentName} @DescendentANames) {
            print ("The trees are different\n");
        }
        }
    }
    }
}

Well I'm only going to help if you try some of this out on your own 
first and post what you've tried.

$tree->get_lca(-nodes => \@nodes) will find the least common ancestor
  ($node) = $tree->find_node($name) will find a particular node based on 
its name

So
- Make a list of node names in Tree A which into a clade with 70% 
support (based on the code I posted before).
- Then find these nodes in Tree B (find_node method).
  - Find their LCA (get_lca method).
  - Then walk back down from the LCA (an internal node) and get all the 
tips (get_all_Descendents + the grep code posted below).
  - Check if there are any other taxa in the clade thus violating your 
requirement of identical clades.

Post your code that does parts of what you want and we can help point.  
Please post to the list so other people can learn from it too.

-jason






More information about the Bioperl-l mailing list