variants int64
// if non-nil, write out any tile variants added while tiling
encoder *gob.Encoder
+ // set Ref flag when writing new variants to encoder
+ encodeRef bool
onAddTileVariant func(libref tileLibRef, hash [blake2b.Size256]byte, seq []byte) error
onAddGenome func(CompactGenome) error
for _, tv := range tvs {
// Assign a new variant ID (unique across all inputs)
// for each input variant.
- variantmap[tileLibRef{Tag: tv.Tag, Variant: tv.Variant}] = tilelib.getRef(tv.Tag, tv.Sequence).Variant
+ variantmap[tileLibRef{Tag: tv.Tag, Variant: tv.Variant}] = tilelib.getRef(tv.Tag, tv.Sequence, tv.Ref).Variant
}
return nil
}
return nil
}
-func (tilelib *tileLibrary) LoadDir(ctx context.Context, path string) error {
+func allGobFiles(path string) ([]string, error) {
var files []string
- var walk func(string) error
- walk = func(path string) error {
- f, err := open(path)
- if err != nil {
- return err
- }
- defer f.Close()
- fis, err := f.Readdir(-1)
- if err != nil {
- files = append(files, path)
- return nil
- }
- for _, fi := range fis {
- if fi.Name() == "." || fi.Name() == ".." {
- continue
- } else if child := path + "/" + fi.Name(); fi.IsDir() {
- err = walk(child)
- if err != nil {
- return err
- }
- } else if strings.HasSuffix(child, ".gob") || strings.HasSuffix(child, ".gob.gz") {
- files = append(files, child)
+ f, err := open(path)
+ if err != nil {
+ return nil, err
+ }
+ defer f.Close()
+ fis, err := f.Readdir(-1)
+ if err != nil {
+ return []string{path}, nil
+ }
+ for _, fi := range fis {
+ if fi.Name() == "." || fi.Name() == ".." {
+ continue
+ } else if child := path + "/" + fi.Name(); fi.IsDir() {
+ add, err := allGobFiles(child)
+ if err != nil {
+ return nil, err
}
+ files = append(files, add...)
+ } else if strings.HasSuffix(child, ".gob") || strings.HasSuffix(child, ".gob.gz") {
+ files = append(files, child)
}
- return nil
}
+ return files, nil
+}
+
+func (tilelib *tileLibrary) LoadDir(ctx context.Context, path string) error {
log.Infof("LoadDir: walk dir %s", path)
- err := walk(path)
+ files, err := allGobFiles(path)
if err != nil {
return err
}
mtx.Unlock()
}
for _, tv := range ent.TileVariants {
- variantmap[tileLibRef{Tag: tv.Tag, Variant: tv.Variant}] = tilelib.getRef(tv.Tag, tv.Sequence).Variant
+ variantmap[tileLibRef{Tag: tv.Tag, Variant: tv.Variant}] = tilelib.getRef(tv.Tag, tv.Sequence, tv.Ref).Variant
}
cgs = append(cgs, ent.CompactGenomes...)
cseqs = append(cseqs, ent.CompactSequences...)
DroppedOutOfOrderTiles int
}
-func (tilelib *tileLibrary) TileFasta(filelabel string, rdr io.Reader, matchChromosome *regexp.Regexp) (tileSeq, []importStats, error) {
+func (tilelib *tileLibrary) TileFasta(filelabel string, rdr io.Reader, matchChromosome *regexp.Regexp, isRef bool) (tileSeq, []importStats, error) {
ret := tileSeq{}
type jobT struct {
label string
} else {
endpos = found[i+1].pos + taglen
}
- path[i] = tilelib.getRef(f.tagid, job.fasta[startpos:endpos])
+ path[i] = tilelib.getRef(f.tagid, job.fasta[startpos:endpos], isRef)
if countBases(job.fasta[startpos:endpos]) != endpos-startpos {
atomic.AddInt64(&lowquality, 1)
}
// Return a tileLibRef for a tile with the given tag and sequence,
// adding the sequence to the library if needed.
-func (tilelib *tileLibrary) getRef(tag tagID, seq []byte) tileLibRef {
+func (tilelib *tileLibrary) getRef(tag tagID, seq []byte, usedByRef bool) tileLibRef {
dropSeq := false
if !tilelib.retainNoCalls {
for _, b := range seq {
tilelib.encoder.Encode(LibraryEntry{
TileVariants: []TileVariant{{
Tag: tag,
+ Ref: usedByRef,
Variant: variant,
Blake2b: seqhash,
Sequence: saveSeq,