[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