func (d *DiversityFilter) filter(buf []*sam.Record, acc string, genome []byte) (out []*sam.Record, acc1 string, genome1 []byte) { fn := func(txn *lmdb.Txn) error { dbi, err := txn.OpenDBI("read", 0) if err != nil { return err } for _, r := range buf { key := []byte(r.Name) val, err := txn.Get(dbi, key) if err != nil { if lmdb.IsNotFound(err) { val, err = r.MarshalText() if err != nil { return err } err = txn.Put(dbi, key, val, 0) if err != nil { return err } } else { return err } } else { var mate *sam.Record = &sam.Record{} err := mate.UnmarshalText(val) raiseError(err) if r.Ref.Name() == mate.Ref.Name() { if acc != r.Ref.Name() { genome, err = d.findGenome(r, d.featureDB, "fna") raiseError(err) acc = r.Ref.Name() if *debug { log.Println(acc) } } diff1, len1 := d.Diff(r, genome) diff2, len2 := d.Diff(mate, genome) if len1 > 0 && len2 > 0 && float64(diff1+diff2)/float64(len1+len2) <= d.Cutoff { out = append(out, r) out = append(out, mate) } else { if *debug { log.Printf("%d, %d, %d, %d\n", diff1, diff2, len1, len2) } } } txn.Del(dbi, key, val) } } return nil } retry: err := d.db.Update(fn) if lmdb.IsMapFull(err) { d.sizeDB *= 2 err = d.db.SetMapSize(d.sizeDB) raiseError(err) goto retry } raiseError(err) genome1 = genome acc1 = acc return }