R/ladderize.R

## ladderize.R (2007-01-04)

##   Ladderize a Tree

## Copyright 2007 Emmanuel Paradis

## This file is part of the R-package `ape'.
## See the file ../COPYING for licensing issues.

ladderize <- function(phy, right = TRUE)
{
    foo <- function(node, END, where) {
        start <- which(phy$edge[, 1] == node)
        end <- c(start[-1] - 1, END)
        size <- end - start + 1
        desc <- phy$edge[start, 2]
        Nclade <- length(desc)
        n <- N[desc]
        o <- order(n, decreasing = right)
        newpos <- c(0, cumsum(size[o][-Nclade])) + where
        desc <- desc[o]
        end <- end[o]
        start <- start[o]
        neworder[newpos] <<- start
        for (i in 1:Nclade)
          if (desc[i] > nb.tip) foo(desc[i], end[i], newpos[i] + 1)
    }
    nb.tip <- length(phy$tip.label)
    nb.node <- phy$Nnode
    nb.edge <- dim(phy$edge)[1]
    tmp <- reorder(phy, "pruningwise")
    N <- .C("node_depth", as.integer(nb.tip), as.integer(nb.node),
            as.integer(tmp$edge[, 1]), as.integer(tmp$edge[, 2]),
            as.integer(nb.edge), double(nb.tip + nb.node),
            DUP = FALSE, PACKAGE = "ape")[[6]]
    neworder <- integer(nb.edge)
    foo(nb.tip + 1, nb.edge, 1)
    phy$edge <- phy$edge[neworder, ]
    if (!is.null(phy$edge.length))
      phy$edge.length <- phy$edge.length[neworder]
    phy
}
gjuggler/ape documentation built on May 17, 2019, 6:03 a.m.