Files
obitools4/pkg/obiseq/class.go

66 lines
1.2 KiB
Go

package obiseq
import (
"fmt"
"hash/crc32"
"strconv"
)
type SequenceClassifier func(sequence BioSequence) string
func AnnotationClassifier(key string) SequenceClassifier {
f := func(sequence BioSequence) string {
if sequence.HasAnnotation() {
value, ok := sequence.Annotations()[key]
if ok {
switch value := value.(type) {
case string:
return value
default:
return fmt.Sprint(value)
}
}
}
return ""
}
return SequenceClassifier(f)
}
var SampleClassifier = AnnotationClassifier("sample")
func PredicateClassifier(predicate SequencePredicate) SequenceClassifier {
f := func(sequence BioSequence) string {
if predicate(sequence) {
return "true"
} else {
return "false"
}
}
return SequenceClassifier(f)
}
// Builds a classifier function based on CRC32 of the sequence
//
func HashClassifier(size int) SequenceClassifier {
f := func(sequence BioSequence) string {
h := crc32.ChecksumIEEE(sequence.Sequence()) % uint32(size)
return strconv.Itoa(int(h))
}
return SequenceClassifier(f)
}
func RotateClassifier(size int) SequenceClassifier {
n := 0
f := func(sequence BioSequence) string {
h := n % size
n++
return strconv.Itoa(int(h))
}
return SequenceClassifier(f)
}