This method finds the child of self that
contains a given descendant desc.
# - - - T a x o n . c h i l d C o n t a i n i n g - - -
def childContaining ( self, desc ):
"""Find self's child whose subtree contains desc.
[ desc is a Taxon in self.txny ->
if desc is a descendant of self ->
return the child of self containing desc
else -> raise ValueError ]
"""
A little error checking first: if desc is
no deeper than self, it cannot be a
descendant of self.
#-- 1 --
if desc.rank.depth <= self.rank.depth:
raise ValueError, ( "Taxon %s is not a descendant of %s." %
(desc, self) )
At this point we know that desc is deeper
than self, so it is safe to assume that
the parent of desc is not None. If the parent of desc is
self, then desc is the
answer—it is the child of self
containing desc.
#-- 2 --
if desc.parent == self:
return desc
Recursion simplifies the rest of this method: either
desc.parent is a child of self, or a node further up the tree.
#-- 3 --
# [ if desc.parent is a descendant of self ->
# return the child of self containing parent
# else -> raise ValueError ]
return self.childContaining ( desc.parent )