mirror of
https://github.com/metabarcoding/obitools4.git
synced 2025-06-29 16:20:46 +00:00
44 lines
1.1 KiB
Go
44 lines
1.1 KiB
Go
|
package obiseq
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
|
||
|
"git.metabarcoding.org/lecasofts/go/oa2/pkg/goutils"
|
||
|
)
|
||
|
|
||
|
// Returns a sub sequence start from position 'from' included,
|
||
|
// to position 'to' excluded. Coordinates start at position 0.
|
||
|
func (sequence BioSequence) Subsequence(from, to int, circular bool) (BioSequence, error) {
|
||
|
|
||
|
if from >= to && !circular {
|
||
|
return NilBioSequence, errors.New("from greater than to")
|
||
|
}
|
||
|
|
||
|
if from < 0 || from >= sequence.Length() {
|
||
|
return NilBioSequence, errors.New("from out of bounds")
|
||
|
}
|
||
|
|
||
|
if to <= 0 || to > sequence.Length() {
|
||
|
return NilBioSequence, errors.New("to out of bounds")
|
||
|
}
|
||
|
|
||
|
var new_seq BioSequence
|
||
|
|
||
|
if from < to {
|
||
|
new_seq = MakeEmptyBioSequence()
|
||
|
new_seq.Write(sequence.Sequence()[from:to])
|
||
|
fmt.Fprintf(&new_seq.sequence.id, "%s_sub[%d..%d]", sequence.Id(), from+1, to)
|
||
|
new_seq.sequence.definition.Write(sequence.sequence.definition.Bytes())
|
||
|
} else {
|
||
|
new_seq, _ = sequence.Subsequence(from, sequence.Length(), false)
|
||
|
new_seq.Write(sequence.Sequence()[0:to])
|
||
|
}
|
||
|
|
||
|
if len(sequence.Annotations()) > 0 {
|
||
|
goutils.CopyMap(new_seq.Annotations(), sequence.Annotations())
|
||
|
}
|
||
|
|
||
|
return new_seq, nil
|
||
|
}
|