Next / Previous / Contents / Shipman's homepage

18.3. TaxaTree.rankParent(): Under what parent does a new taxon go?

nomcompile3
# - - -   T a x a T r e e . r a n k P a r e n t

    def rankParent ( self, newRankCode ):
        '''Find the parent of a new taxon of a given rank code.
        '''

For the related verification function, see Section 7.9, “rank-parent: What taxon is the parent of a new taxon of a given rank?”.

First we dispense with the trivial case where the tree is empty. If the tree isn't empty, we set local variable node to the root.

nomcompile3
        #-- 1 --
        # [ rankCode is a code in self.hier ->
        #     if self.root is None ->
        #       raise ValueError
        #     else ->
        #       node  :=  self.root
        #       newRank  :=  Rank instance from self.hier with
        #                    code newRankCode ]
        if self.root is None:
            raise ValueError ( "No taxon can be added because the "
                "tree is empty." )
        node = self.root
        newRank = self.hier.lookupRankCode ( newRankCode )

Next we walk down the tree, visiting the last child of each node, until we reach a node that either has no children, or it has a child at the new rank's level (or lower, which is an error condition that will be caught elsewhere). We can index a Taxon as if it were a sequence of its children, so the last child is index [-1]; see Section 19.3, “Taxon.__getitem__(): Return the (n)th child”. Also, Rank instances are ordered by increasing depth; see Section 16.1, “Rank.__cmp__().

nomcompile3
        #-- 2 --
        # [ node is a Taxon with rank < newRank ->
        #     node  :=  last node (in preorder) in node's subtree
        #         that has no children or its children have rank
        #         >= newRank ]
        while ( ( len(node) > 0 ) and
                ( node[-1].rank < newRank ) ):
            node = node[-1]

        #-- 3 --
        return node