Patch a bug in the subseq and revcomplement methods. That patchs the bug in the option -c of obipcr

Former-commit-id: 7999b917d07545271036af6e66f53aea27fc6e7b
This commit is contained in:
2024-03-11 10:54:37 +01:00
parent 8a2bbd1c3b
commit f4d71d4a66
3 changed files with 17 additions and 2 deletions

View File

@ -333,6 +333,9 @@ func _Pcr(seq ApatSequence,
annot["reverse_primer"] = reverse.String() annot["reverse_primer"] = reverse.String()
match, _ = seq.pointer.reference.Subsequence(rm[0], rm[1], opt.pointer.circular) match, _ = seq.pointer.reference.Subsequence(rm[0], rm[1], opt.pointer.circular)
if match == nil {
log.Fatalf("error in extracting sequence from reference: %d:%d (%v)\n", rm[0], rm[1], opt.pointer.circular)
}
match = match.ReverseComplement(true) match = match.ReverseComplement(true)
annot["reverse_match"] = match.String() annot["reverse_match"] = match.String()
match.Recycle() match.Recycle()

View File

@ -43,6 +43,10 @@ func nucComplement(n byte) byte {
// The function returns the reverse complemented BioSequence. // The function returns the reverse complemented BioSequence.
func (sequence *BioSequence) ReverseComplement(inplace bool) *BioSequence { func (sequence *BioSequence) ReverseComplement(inplace bool) *BioSequence {
if sequence == nil {
return nil
}
if !inplace { if !inplace {
sequence = sequence.Copy() sequence = sequence.Copy()
} }

View File

@ -2,6 +2,8 @@ package obiseq
import ( import (
"fmt" "fmt"
log "github.com/sirupsen/logrus"
) )
// Subsequence returns a subsequence of the BioSequence. // Subsequence returns a subsequence of the BioSequence.
@ -23,14 +25,20 @@ func (sequence *BioSequence) Subsequence(from, to int, circular bool) (*BioSeque
return nil, fmt.Errorf("from out of bounds %d < 0", from) return nil, fmt.Errorf("from out of bounds %d < 0", from)
} }
if from >= sequence.Len() { if from >= sequence.Len() && !circular {
return nil, return nil,
fmt.Errorf("from out of bounds %d >= %d", from, sequence.Len()) fmt.Errorf("from out of bounds %d >= %d", from, sequence.Len())
} else {
log.Debugf("(%s) correcting from position from %d to %d", sequence.Id(), to, (to-1)%sequence.Len()+1)
from = from % sequence.Len()
} }
if to > sequence.Len() { if to > sequence.Len() && !circular {
return nil, return nil,
fmt.Errorf("to out of bounds %d > %d", to, sequence.Len()) fmt.Errorf("to out of bounds %d > %d", to, sequence.Len())
} else {
log.Debugf("(%s) correcting to position from %d to %d", sequence.Id(), to, (to-1)%sequence.Len()+1)
to = ((to - 1) % sequence.Len()) + 1
} }
var newSeq *BioSequence var newSeq *BioSequence