Creating phylogenies
Reading phylogenies from disk
Phylo can read newick trees either from strings,
using Phylo
simpletree = parsenewick("((,Tip:1.0)Internal,)Root;")
RootedTree with 3 tips, 5 nodes and 4 branches.
Leaf names are Tip, Node 1 and Node 4
which will result in the following tree:
getbranches(simpletree)
skipmissing(Union{Missing, LinkBranch{OneRoot, String, Dict{String, Any}, Float64}}[LinkBranch 1, from node Internal to node Tip (length 1.0).
, LinkBranch 2, from node Internal to node Node 1.
, LinkBranch 3, from node Root to node Internal.
, LinkBranch 4, from node Root to node Node 4.
])
or from files
tree = open(parsenewick, Phylo.path("H1N1.newick"))
RootedTree with 507 tips, 1013 nodes and 1012 branches.
Leaf names are 227, 294, 295, 110, 390, ... [501 omitted] ... and 418
It can read nexus trees from files too:
ts = open(parsenexus, Phylo.path("H1N1.trees"))
TreeSet with 2 trees, each with 507 tips.
Tree names are TREE2 and TREE1
TREE1: RootedTree with 507 tips, 1013 nodes and 1012 branches.
Leaf names are H1N1_A_BRAZIL_11_1978, H1N1_A_TAHITI_8_1998, H1N1_A_TAIWAN_1_1986, H1N1_A_BAYERN_7_1995, H1N1_A_ENGLAND_45_1998, ... [501 omitted] ... and H1N1_A_PUERTORICO_8_1934
TREE2: RootedTree with 507 tips, 1013 nodes and 1012 branches.
Leaf names are H1N1_A_BRAZIL_11_1978, H1N1_A_TAHITI_8_1998, H1N1_A_TAIWAN_1_1986, H1N1_A_BAYERN_7_1995, H1N1_A_ENGLAND_45_1998, ... [501 omitted] ... and H1N1_A_PUERTORICO_8_1934
Reading multiple trees from a nexus file returns a TreeSet
- index to get the individual trees
gettreeinfo(ts)
Dict{String, Dict{String, Any}} with 2 entries:
"TREE2" => Dict("lnP"=>-1.0)
"TREE1" => Dict("lnP"=>1.0)
ts["TREE1"]
RootedTree with 507 tips, 1013 nodes and 1012 branches.
Leaf names are H1N1_A_BRAZIL_11_1978, H1N1_A_TAHITI_8_1998, H1N1_A_TAIWAN_1_1986, H1N1_A_BAYERN_7_1995, H1N1_A_ENGLAND_45_1998, ... [501 omitted] ... and H1N1_A_PUERTORICO_8_1934
Creating random phylogenies
The package can be used to generate random trees using the framework from Distributions
. For instance, to construct a sampler for 5 tip non-ultrametric trees and generate a random tree of that type
using Phylo
nu = Nonultrametric(5);
tree = rand(nu)
RootedTree with 5 tips, 9 nodes and 8 branches.
Leaf names are tip 4, tip 2, tip 1, tip 5 and tip 3
Or two trees
trees = rand(nu, ["Tree 1", "Tree 2"])
TreeSet with 2 trees, each with 5 tips.
Tree names are Tree 2 and Tree 1
Tree 1: RootedTree with 5 tips, 9 nodes and 8 branches.
Leaf names are tip 1, tip 4, tip 3, tip 5 and tip 2
Tree 2: RootedTree with 5 tips, 9 nodes and 8 branches.
Leaf names are tip 3, tip 2, tip 4, tip 1 and tip 5
Importing phylogenies from R
Phylo allows transferring trees from R's ape
package directly via RCall. This allows any existing R library functions to be carried out on julia trees. Naturally the medium-term plan is to make this package feature-complete with existing functionality in R, and as a result the R interface is not built into the package, avoiding having RCall (and R) a dependency. Instead, if you want to use the R interface you need to do it manually, as below:
julia> using RCall
julia> include(Phylo.path("rcall.jl", dir = "src"));
R> library(ape)
You can then translate back and forth using rcopy
on R phylo
objects, and RObject
constructors on julia NamedTree
types to keep them in Julia or @rput
to move the object into R:
julia> rt = rcall(:rtree, 10)
RCall.RObject{RCall.VecSxp}
Phylogenetic tree with 10 tips and 9 internal nodes.
Tip labels:
t10, t8, t1, t2, t6, t5, ...
Rooted; includes branch lengths.
julia> jt = rcopy(NamedTree, rt)
NamedTree with 10 tips, 19 nodes and 18 branches.
Leaf names are t8, t3, t7, t9, t6, ... [4 omitted] ... and t1
julia> rjt = RObject(jt); # manually translate it back to R
R> if (all.equal($rjt, $rt)) "no damage in translation"
[1] "no damage in translation"
julia> @rput rt; # Or use macros to pass R object back to R
julia> @rput jt; # And automatically translate jt back to R
R> jt
Phylogenetic tree with 10 tips and 9 internal nodes.
Tip labels:
t10, t8, t1, t2, t6, t5, ...
Rooted; includes branch lengths.
R> if (all.equal(rt, jt)) "no damage in translation"
[1] "no damage in translation"
```@docs parsenewick parsenexus Nonultrametric Ultrametric