mirror of
https://github.com/metabarcoding/obitools4.git
synced 2025-06-29 16:20:46 +00:00
Changes to be committed:
modified: cmd/obitools/obitag/main.go modified: cmd/obitools/obitaxonomy/main.go modified: pkg/obiformats/csvtaxdump_read.go modified: pkg/obiformats/ecopcr_read.go modified: pkg/obiformats/ncbitaxdump_read.go modified: pkg/obiformats/ncbitaxdump_readtar.go modified: pkg/obiformats/newick_write.go modified: pkg/obiformats/options.go modified: pkg/obiformats/taxonomy_read.go modified: pkg/obiformats/universal_read.go modified: pkg/obiiter/extract_taxonomy.go modified: pkg/obioptions/options.go modified: pkg/obioptions/version.go new file: pkg/obiphylo/tree.go modified: pkg/obiseq/biosequenceslice.go modified: pkg/obiseq/taxonomy_methods.go modified: pkg/obitax/taxonomy.go modified: pkg/obitax/taxonset.go modified: pkg/obitools/obiconvert/sequence_reader.go modified: pkg/obitools/obitag/obitag.go modified: pkg/obitools/obitaxonomy/obitaxonomy.go modified: pkg/obitools/obitaxonomy/options.go deleted: sample/.DS_Store
This commit is contained in:
71
pkg/obiphylo/tree.go
Normal file
71
pkg/obiphylo/tree.go
Normal file
@ -0,0 +1,71 @@
|
||||
package obiphylo
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type PhyloNode struct {
|
||||
Name string
|
||||
Children map[*PhyloNode]float64
|
||||
Attributes map[string]any
|
||||
}
|
||||
|
||||
func NewPhyloNode() *PhyloNode {
|
||||
return &PhyloNode{}
|
||||
}
|
||||
|
||||
func (n *PhyloNode) AddChild(child *PhyloNode, distance float64) {
|
||||
if n.Children == nil {
|
||||
n.Children = map[*PhyloNode]float64{}
|
||||
}
|
||||
n.Children[child] = distance
|
||||
}
|
||||
|
||||
func (n *PhyloNode) SetAttribute(key string, value any) {
|
||||
if n.Attributes == nil {
|
||||
n.Attributes = make(map[string]any)
|
||||
}
|
||||
n.Attributes[key] = value
|
||||
}
|
||||
|
||||
func (n *PhyloNode) GetDistanceToChild(child *PhyloNode) float64 {
|
||||
return n.Children[child]
|
||||
}
|
||||
|
||||
func (n *PhyloNode) GetAttribute(key string) any {
|
||||
return n.Attributes[key]
|
||||
}
|
||||
|
||||
func (n *PhyloNode) Newick(level int) string {
|
||||
nc := len(n.Children)
|
||||
result := strings.Builder{}
|
||||
result.WriteString(strings.Repeat(" ", level))
|
||||
if nc > 0 {
|
||||
result.WriteString("(\n")
|
||||
i := 0
|
||||
for child, distance := range n.Children {
|
||||
result.WriteString(child.Newick(level + 1))
|
||||
if !math.IsNaN(distance) {
|
||||
result.WriteString(fmt.Sprintf(":%.5f", distance))
|
||||
}
|
||||
i++
|
||||
if i < nc {
|
||||
result.WriteByte(',')
|
||||
}
|
||||
result.WriteString("\n")
|
||||
}
|
||||
result.WriteString(strings.Repeat(" ", level))
|
||||
result.WriteByte(')')
|
||||
}
|
||||
if n.Name != "" {
|
||||
result.WriteString(n.Name)
|
||||
}
|
||||
|
||||
if level == 0 {
|
||||
result.WriteString(";\n")
|
||||
}
|
||||
|
||||
return result.String()
|
||||
}
|
Reference in New Issue
Block a user