Gotree: toolkit and api for phylogenetic tree manipulation

June 5, 2025 ยท View on GitHub

API

annotate

Annotate function may be used to set a name to an internal node

package main

import (
	"fmt"
	"strings"

	"github.com/evolbioinfo/gotree/io/newick"
	"github.com/evolbioinfo/gotree/tree"
)

func main() {
	var treeString string
	var t *tree.Tree
	var err error
	treeString = "(Tip4,Tip0,(Tip3,(Tip2,Tip1)));"
	t, err = newick.NewParser(strings.NewReader(treeString)).Parse()
	if err != nil {
		panic(err)
	}
	namemap := make(map[string][]string)
	namemap["internalnode"] = []string{"Tip1", "Tip2", "Tip3"}
	// Annotates with node name and not all subtrees
	t.Annotate(namemap, false, false) 
	fmt.Println(t.Newick())
	// Should print (Tip4,Tip0,(Tip3,(Tip2,Tip1))internalnode);
}

Also, we can use LeastCommonAncestor function

package main

import (
	"fmt"
	"strings"

	"github.com/evolbioinfo/gotree/io/newick"
	"github.com/evolbioinfo/gotree/tree"
)

func main() {
	var treeString string
	var t *tree.Tree
	var err error
	treeString = "(Tip4,Tip0,(Tip3,(Tip2,Tip1)));"
	t, err = newick.NewParser(strings.NewReader(treeString)).Parse()
	if err != nil {
		panic(err)
	}

	tipnames := []string{"Tip1","Tip2","Tip3"}
	nodeindex := tree.NewNodeIndex(t)
	n, _, _, err := t.LeastCommonAncestorUnrooted(nodeindex, tipnames...)
	if err != nil {
		panic(err)
	}
	n.SetName("internalnode")
	fmt.Println(t.Newick())
	// Should print (Tip4,Tip0,(Tip3,(Tip2,Tip1))internalnode);
}