setOldClass("phylo")
setOldClass("multiPhylo")
setOldClass("gg")
setOldClass("ggplot")

setClassUnion("phyloOrmultiPhylo", c("phylo", "multiPhylo"))


supported_tree_object <- function() {
    c("apeBootstrap",
      "beast",
      "codeml_mlc",
      "codeml",
      "hyphy",
      "jplace",
      "nhx",
      "paml_rst",
      "phangorn",      
      "phylip",
      "r8s",
      "raxml")
}

##' Class "apeBootstrap"
##' This class stores ape bootstrapping analysis result
##'
##'
##' @name apeBootstrap-class
##' @docType class
##' @slot phylo phylo object of treetext
##' @slot fields available features
##' @slot bootstrap bootstrap value
##' @slot extraInfo extra information
##' @exportClass apeBootstrap
##' @author Guangchuang Yu \url{http://guangchuangyu.github.io}
##' @keywords classes
setClass("apeBootstrap",
         representation = representation(
             phylo = "phylo",
             fields = "character",
             bootstrap = "data.frame",
             extraInfo = "data.frame"
         )
         )

##' Class "beast"
##' This class stores information of beast output
##'
##'
##' @name beast-class
##' @aliases beast-class
##'      get.tree,beast-method
##' 
##' @docType class
##' @slot fields beast statistic variables
##' @slot treetext tree text in beast file
##' @slot phylo tree phylo object
##' @slot translation tip number to name translation in beast file
##' @slot stats beast statistics
##' @slot file beast file, nexus format
##' @slot extraInfo extra information
##' @exportClass beast
##' @author Guangchuang Yu \url{http://guangchuangyu.github.io}
##' @seealso \code{\link{show}} \code{\link{get.fields}}
##'           \code{\link{ggtree}}
##' @keywords classes
setClass("beast",
         representation  = representation(
             fields      = "character",
             treetext    = "character",
             phylo       = "phylo",
             translation = "matrix",
             stats       = "data.frame",
             file        = "character",
             extraInfo   = "data.frame"
             )
         )


##' Class "codeml_mlc"
##' This class stores information of mlc file frm codeml output
##'
##'
##' @name codeml_mlc-class
##' @docType class
##' @slot fields available features
##' @slot treetext tree text
##' @slot phylo phylo object
##' @slot dNdS dN dS information
##' @slot mlcfile mlc file
##' @slot extraInfo extra information
##' @exportClass codeml_mlc
##' @author Guangchuang Yu
##' @seealso \linkS4class{paml_rst} \linkS4class{codeml}
##' @keywords classes
setClass("codeml_mlc",
         representation = representation(
             fields     = "character",
             treetext   = "character",
             phylo      = "phylo",
             dNdS       = "matrix",
             ## seq_type   = "character",
             ## tip_seq    = "character",
             mlcfile    = "character",
             extraInfo  = "data.frame"
             )
         )

##' Class "paml_rst"
##' This class stores information of rst file from PAML output
##'
##'
##' @name paml_rst-class
##' @aliases paml_rst-class
##'   set.subs,paml_rst-method
##'   set.subs<-,paml_rst-method
##' 
##' @docType class
##' @slot fields availabel attributes
##' @slot treetext tree text
##' @slot phylo phylo object
##' @slot seq_type one of "NT" and "AA"
##' @slot tip_seq sequences of tips
##' @slot marginal_ancseq Marginal reconstruction of ancestral sequences
##' @slot joint_ancseq Joint reconstruction of ancestral sequences
##' @slot marginal_subs sequence substitutions based on marginal_ancseq
##' @slot joint_subs sequence substitutions based on joint_ancseq
##' @slot marginal_AA_subs Amino acid sequence substitutions based on marginal_ancseq
##' @slot joint_AA_subs Amino acid sequence substitutions based on joint_ancseq
##' @slot rstfile rst file
##' @slot extraInfo extra information
##' @exportClass paml_rst
##' @author Guangchuang Yu \url{http://guangchuangyu.github.io}
##' @seealso \linkS4class{codeml} \linkS4class{codeml_mlc}
##' @keywords classes
setClass("paml_rst",
         representation       = representation(
             fields           = "character",
             treetext         = "character",
             phylo            = "phylo",
             seq_type         = "character",
             tip_seq          = "character",
             marginal_ancseq  = "character",
             joint_ancseq     = "character",
             marginal_subs    = "data.frame",
             joint_subs       = "data.frame",
             marginal_AA_subs = "data.frame",
             joint_AA_subs    = "data.frame",
             rstfile          = "character",
             extraInfo        = "data.frame"
         )
         )

##' Class "codeml"
##' This class stores information of output from codeml
##'
##'
##' @name codeml-class
##' @docType class
##' @slot mlc A \code{code_mlc} object
##' @slot rst A \code{paml_rst} object
##' @slot extraInfo extra information
##' @exportClass codeml
##' @seealso \linkS4class{codeml_mlc} \linkS4class{paml_rst}
##' @keywords codeml
setClass("codeml",
         representation = representation(
             mlc       = "codeml_mlc",
             rst       = "paml_rst",
             extraInfo = "data.frame"
             )
         )



##' Class "hyphy"
##' This class stores information of HYPHY output
##'
##'
##' @name hyphy-class
##' @docType class
##' @slot fields available features
##' @slot treetext tree text
##' @slot phylo phylo object
##' @slot seq_type one of "NT" and "AA"
##' @slot subs sequence substitutions
##' @slot AA_subs Amino acid sequence substitution
##' @slot ancseq ancestral sequences
##' @slot tip_seq tip sequences
##' @slot tip.fasfile fasta file of tip sequences
##' @slot tree.file tree file
##' @slot ancseq.file ancestral sequence file, nexus format
##' @slot extraInfo extra information
##' @exportClass hyphy
##' @author Guangchuang Yu \url{http://guangchuangyu.github.io}
##' @seealso \linkS4class{paml_rst}
##' @keywords classes
setClass("hyphy",
         representation  = representation(
             fields      = "character",
             treetext    = "character",
             phylo       = "phylo",
             seq_type    = "character",
             subs        = "data.frame",
             AA_subs     = "data.frame",
             ancseq      = "character",
             tip_seq     = "character",
             tip.fasfile = "character",
             tree.file   = "character",
             ancseq.file = "character",
             extraInfo   = "data.frame"
             )
         )

##' Class "jplace"
##' This class stores information of jplace file.
##'
##'
##' @name jplace-class
##' @aliases jplace-class
##'   show,jplace-method
##'   get.placements,jplace-method
##'   get.treeinfo,jplace-method
##'   get.fields,jplace-method
##'   get.treetext,jplace-method
##'
##' @docType class
##' @slot fields colnames of first variable of placements
##' @slot treetext tree text
##' @slot phylo tree phylo object
##' @slot placements placement information
##' @slot version version
##' @slot metadata metadata
##' @slot file jplace file
##' @slot extraInfo extra information
##' @exportClass jplace
##' @author Guangchuang Yu \url{http://guangchuangyu.github.io}
##' @seealso \code{\link{show}} \code{\link{get.tree}}
##'          \code{\link{ggtree}}
##' @keywords classes
setClass("jplace",
         representation = representation(
             fields     = "character",
             treetext   = "character",
             phylo      = "phylo",
             placements = "data.frame",
             version    = "numeric",
             metadata   = "list",
             file       = "character",
             extraInfo  = "data.frame"
             )
         )


##' Class "nhx"
##' This class stores nhx tree
##'
##'
##' @name nhx-class
##' @rdname nhx-class
##' @docType class
##' @slot file input file
##' @slot fields available feature
##' @slot phylo phylo object
##' @slot nhx_tags tag information in nhx file
##' @slot extraInfo extra information
##' @exportClass nhx
##' @author Guangchuang Yu \url{http://guangchuangyu.github.io}
##' @keywords classes
setClass("nhx",
         representation = representation(
             file = "character",
             fields = "character",
             phylo = "phylo",
             nhx_tags = "data.frame",
             extraInfo = "data.frame"
         )
         )


##' Class "phangorn"
##' This class stores ancestral sequences inferred from 'phangorn'
##'
##'
##' @name phangorn-class
##' @docType class
##' @slot fields available attributes
##' @slot phylo phylo object
##' @slot seq_type one of "NT" and "AA"
##' @slot tip_seq sequences of tips
##' @slot ancseq ancenstral sequences
##' @slot subs sequence substitution
##' @slot AA_subs Amino acid sequence substitution
##' @slot extraInfo extra information
##' @exportClass phangorn
##' @author Guangchuang Yu \url{http://guangchuangyu.github.io}
##' @seealso \linkS4class{paml_rst}
##' @keywords classes
setClass("phangorn",
         representation = representation(
             fields = "character",
             phylo = "phylo",
             seq_type = "character",
             tip_seq = "character",
             ancseq = "character",
             subs = "data.frame",
             AA_subs = "data.frame",
             extraInfo = "data.frame")
         )



##' Class "phylip"
##' This class stores phylip tree(s)
##'
##'
##' @name phylip-class
##' @docType class
##' @slot file input file
##' @slot fields available feature
##' @slot phylo phylo or multiPhylo
##' @slot ntree number of trees
##' @slot sequence sequences
##' @slot extraInfo extra information
##' @exportClass phylip
##' @author Guangchuang Yu
##' @keywords classes
setClass("phylip",
         representation = representation(
             file = "character",
             fields = "character",
             phylo = "phyloOrmultiPhylo",
             ntree = "numeric",
             sequence = "character",
             extraInfo = "data.frame")
         )


##' Class "r8s"
##' This class stores output info from r8s
##'
##'
##' @name r8s-class
##' @docType class
##' @slot file input file
##' @slot fields available feature
##' @slot treetext tree text
##' @slot phylo multiPhylo, time tree, rate tree and absolute substitution tree
##' @slot extraInfo extra information
##' @exportClass r8s
##' @author Guangchuang Yu \url{http://guangchuangyu.github.io}
##' @keywords classes
setClass("r8s",
         representation = representation(
             file      = "character",
             fields    = "character",
             treetext  = "character",
             phylo     = "multiPhylo",
             extraInfo = "data.frame"
             )
         )


##' Class "raxml"
##' This class stores RAxML bootstrapping analysis result
##'
##'
##' @name raxml-class
##' @docType class
##' @slot file input file
##' @slot fields available features
##' @slot treetext tree text
##' @slot phylo phylo object of treetext
##' @slot bootstrap bootstrap value
##' @slot extraInfo extra information
##' @exportClass raxml
##' @author Guangchuang Yu \url{http://guangchuangyu.github.io}
##' @keywords classes
setClass("raxml",
         representation = representation(
             file       = "character",
             treetext   = "character"
         ),
         contains = "apeBootstrap"
         )