## ##' tree annotation of sequence substitution by comparing to parent node
## ##'
## ##'
## ##' @title treeAnno.pml
## ##' @param pmlTree tree in pml object, output of phangorn::optim.pml
## ##' @param type one of 'ml' and 'bayes' for inferring ancestral sequences
## ##' @return phangorn object
## ##' @importFrom ape read.tree
## ##' @importFrom ape reorder.phylo
## ##' @export
## ##' @author Yu Guangchuang
## phyPML <- function(pmlTree, type = "ml") {
##     sequences <- pmlToSeqString(pmlTree, type, includeAncestor=TRUE)
##     tr <- pmlTree$tree
##     tr <- reorder.phylo(tr)

##     if (is.null(tr$node.label)) {
##         n <- length(tr$tip.label)
##         nl <- (n+1):(2*n-2)
##         tr$node.label <- as.character(nl)
##     } else {
##         names(sequences) <- c(tr$tip.label, tr$node.label)
##     }

##     seq_type <- get_seqtype(sequences)
##     res <- new("phangorn",
##                phylo = tr,
##                fields = "subs",
##                seq_type = seq_type,
##                ancseq = sequences)


##     res@tip_seq <- sequences[names(sequences) %in% tr$tip.label]

##     res@subs <- get.subs_(res@phylo, sequences, translate=FALSE)
##     if (seq_type == "NT") {
##         res@AA_subs <- get.subs_(res@phylo, sequences, translate=TRUE)
##         res@fields %<>% c("AA_subs")
##     }

##     return(res)
## }




## ##' @rdname get.subs-methods
## ##' @exportMethod get.subs
## setMethod("get.subs", signature(object = "phangorn"),
##           function(object, type, ...) {
##               if (type == "AA_subs")
##                   return(object@AA_subs)
##               return(object@subs)
##           }
##           )


## ##' @rdname groupClade-methods
## ##' @exportMethod groupClade
## setMethod("groupClade", signature(object="phangorn"),
##           function(object, node, group_name="group") {
##               groupClade_(object, node, group_name)
##           })

## ##' @rdname scale_color-methods
## ##' @exportMethod scale_color
## setMethod("scale_color", signature(object="phangorn"),
##           function(object, by, ...) {
##               scale_color_(object, by, ...)
##           })


## ##' @rdname gzoom-methods
## ##' @exportMethod gzoom
## setMethod("gzoom", signature(object="phangorn"),
##           function(object, focus, subtree=FALSE, widths=c(.3, .7)) {
##               gzoom.phylo(get.tree(object), focus, subtree, widths)
##           })


## ##' @rdname get.tree-methods
## ##' @exportMethod get.tree
## setMethod("get.tree", signature(object="phangorn"),
##           function(object,...) {
##               object@phylo
##           }
##           )


## ##' @rdname get.fields-methods
## ##' @exportMethod get.fields
## setMethod("get.fields", signature(object="phangorn"),
##           function(object, ...) {
##               get.fields.tree(object)
##           }
##           )


## ##' convert pml object to XStringSet object
## ##'
## ##'
## ##' @title pmlToSeq
## ##' @param pml pml object
## ##' @param includeAncestor logical
## ##' @param type one of "marginal", "ml", "bayes"
## ##' @return XStringSet
## ## @importFrom Biostrings DNAStringSet
## ##' @export
## ##' @author ygc
## pmlToSeq <- function(pml, type="ml", includeAncestor=TRUE) {
##     DNAStringSet <- get_fun_from_pkg("Biostrings", "DNAStringSet")
##     pmlToSeqString(pml, type, includeAncestor) %>%
##         DNAStringSet
## }

## ## @importFrom phangorn ancestral.pml
## pmlToSeqString <- function(pml, type, includeAncestor=TRUE) {
##     if (includeAncestor == FALSE) {
##         phyDat <- pml$data
##     } else {
##         ancestral.pml <- get_fun_from_pkg("phangorn", "ancestral.pml")
##         phyDat <- ancestral.pml(pml, type)
##     }

##     phyDat <- matrix2vector.phyDat(phyDat)
##     ## defined by phangorn
##     labels <- c("a", "c", "g", "t", "u", "m", "r", "w", "s",
##                 "y", "k", "v", "h", "d", "b", "n", "?", "-")
##     labels <- toupper(labels)

##     index <- attr(phyDat, "index")

##     result <- do.call(rbind, phyDat)
##     result <- result[, index, drop=FALSE]

##     res <- apply(result, 2, function(i) labels[i])
##     res <- apply(res, 1, paste, collapse="")
##     names(res) <- rownames(result)
##     return(res)
## }



## matrix2vector.phyDat <- function(x) {
##     index <- attr(x, "index")
##     res <- lapply(x, matrix2vector.phyDat.item)
##     names(res) <- names(x)
##     attr(res, "index") <- index
##     class(res) <- "phyDat"
##     return(res)
## }

## matrix2vector.phyDat.item <- function(y) {
##     ii <- apply(y, 1, function(xx) {
##         ## return index of a c g and t, if it has highest probability
##         ## otherwise return index of -
##         jj <- which(xx == max(xx))
##         if ( length(jj) > 1) {
##             if (length(jj) < 4) {
##                 warning("ambiguous found...\n")
##             } else {
##                 ## cat("insertion found...\n")
##             }
##             ## 18 is the gap(-) index of base character defined in phangorn
##             ## c("a", "c", "g", "t", "u", "m", "r", "w", "s",
## 	    ##   "y", "k", "v", "h", "d", "b", "n", "?", "-")
##             18
##         } else {
##             jj
##         }
##     })
##     unlist(ii)
## }