Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

droptips! when tree size is 2 #99

Open
richardreeve opened this issue Aug 4, 2024 · 0 comments
Open

droptips! when tree size is 2 #99

richardreeve opened this issue Aug 4, 2024 · 0 comments

Comments

@richardreeve
Copy link
Member

From a user:

I use Phylo.jl to generate trees under various custom stochastic branching processes forward in time where the "root lineage" and its length is just as valid as any other internal branch.

Take the simplest tree with all branches of length 1

tree = RootedTree()
root, n1 = createnode!(tree), createnode!(tree)
createbranch!(tree, root, n1, 1.0)
lv1, lv2 = createnode!(tree), createnode!(tree)
createbranch!(tree, n1, lv1, 1.0)
createbranch!(tree, n1, lv2, 1.0)

julia> tree
RootedTree with 2 tips and 1 root. Leaf names are Node 3 and Node 4

4 nodes: [RecursiveNode{OneRoot} 'Node 1', a root node with 1 outbound connection (branch 1), RecursiveNode{OneRoot} 'Node 2', an internal node with 1 inbound and 2 outbound connections (branches 1 and [2, 3]), RecursiveNode{OneRoot} 'Node 3', a leaf with an incoming connection (branch 2) and RecursiveNode{OneRoot} 'Node 4', a leaf with an incoming connection (branch 3)]

3 branches: [RecursiveBranch{OneRoot} 1, from node 'Node 1' to node 'Node 2' (length 1.0), RecursiveBranch{OneRoot} 2, from node 'Node 2' to node 'Node 3' (length 1.0) and RecursiveBranch{OneRoot} 3, from node 'Node 2' to node 'Node 4' (length 1.0)]

Node records: "Node 1" => Dict{String, Any}() ... "Node 4" => Dict{String, Any}()
                  --<b1>--- lv1
                /
root --<b0>-- n1
                \ 
                  --<b2>--- lv2

After dropping lv2

droptips!(tree, lv2)

julia> tree
RootedTree with 1 tips and 1 root. Leaf names are Node 3

1 nodes: [RecursiveNode{OneRoot} 'Node 3', an isolated node with no connections]

0 branches: []

Node records: Dict{String, Dict{String, Any}}("Node 3" => Dict())

This makes sense when the root has no specific meaning, e.g. in reconstructed phylogenetic trees, but in the context of a "timetree" this is inconsitent. If there's a single remaining lineage (in this case lv1) then it should not be collapsed and simply be given the length b0.length + b1.length.

Would it be possible to add an option, something like droptips!(tree::AbstractTree{OneTree}, tips; preserveroot=true)?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant