return taglib.setTags(seqs)
}
-type tagMatch struct {
- id tagID
- pos int
-}
-
-func (taglib *tagLibrary) FindAll(buf []byte, fn func(id tagID, pos int)) {
+func (taglib *tagLibrary) FindAll(buf []byte, fn func(id tagID, pos, taglen int)) {
var key tagmapKey
for i := 0; i <= len(buf)-taglib.keylen; i++ {
copy(key[:taglib.keylen], buf[i:])
// key portion matches, but not the entire tag
continue
} else {
- fn(taginfo.id, i)
+ fn(taginfo.id, i, len(taginfo.tagseq))
i += len(taginfo.tagseq) - 1 // don't try to match overlapping tags
}
}
var _ = check.Suite(&taglibSuite{})
+type tagMatch struct {
+ id tagID
+ pos int
+ taglen int
+}
+
func (s *taglibSuite) TestFindAllTinyData(c *check.C) {
pr, pw, err := os.Pipe()
c.Assert(err, check.IsNil)
c.Assert(err, check.IsNil)
haystack := []byte(`ggagaactgtgctccgccttcagaccccccccccccccccccccacacatgctagcgcgtcggggtgggggggggggggggggggggggggggactctagcagagtggccagccac`)
var matches []tagMatch
- taglib.FindAll(haystack, func(id tagID, pos int) {
- matches = append(matches, tagMatch{id, pos})
+ taglib.FindAll(haystack, func(id tagID, pos, taglen int) {
+ matches = append(matches, tagMatch{id, pos, taglen})
})
- c.Check(matches, check.DeepEquals, []tagMatch{{0, 0}, {1, 44}, {2, 92}})
+ c.Check(matches, check.DeepEquals, []tagMatch{{0, 0, 24}, {1, 44, 24}, {2, 92, 24}})
}
func (s *taglibSuite) TestFindAllRealisticSize(c *check.C) {
c.Assert(err, check.IsNil)
c.Logf("@%v find tags in input", time.Since(start))
var matches []tagMatch
- taglib.FindAll(haystack, func(id tagID, pos int) {
- matches = append(matches, tagMatch{id, pos})
+ taglib.FindAll(haystack, func(id tagID, pos, taglen int) {
+ matches = append(matches, tagMatch{id, pos, taglen})
})
c.Logf("@%v done", time.Since(start))
- c.Check(matches[0], check.Equals, tagMatch{0, 0})
+ c.Check(matches[0], check.Equals, tagMatch{0, 0, tagsize})
c.Check(matches[1].id, check.Equals, tagID(1))
}
var path []tileLibRef
tilestart := -1 // position in fasta of tile that ends here
tiletagid := tagID(-1) // tag id starting tile that ends here
- tilelib.taglib.FindAll(job.fasta, func(id tagID, pos int) {
+ tilelib.taglib.FindAll(job.fasta, func(id tagID, pos, taglen int) {
if tilestart >= 0 {
- path = append(path, tilelib.getRef(tiletagid, job.fasta[tilestart:pos]))
+ path = append(path, tilelib.getRef(tiletagid, job.fasta[tilestart:pos+taglen]))
}
tilestart = pos
tiletagid = id