+ log.Infof("assembling %d sequences concurrently", len(seqnames))
+ var wg sync.WaitGroup
+ outbuf := make([]bytes.Buffer, len(seqnames))
+ bedbuf := make([]bytes.Buffer, len(seqnames))
+ for seqidx, seqname := range seqnames {
+ seqname := seqname
+ outbuf := &outbuf[seqidx]
+ bedbuf := &bedbuf[seqidx]
+ if bedout == nil {
+ bedbuf = nil
+ }
+ // TODO: limit number of goroutines and unflushed bufs to ncpus
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ cmd.exportSeq(outbuf, bedbuf, taglen, seqname, refseq[seqname], tileVariant, cgs)
+ log.Infof("assembled %q to outbuf %d bedbuf %d", seqname, outbuf.Len(), bedbuf.Len())
+ }()
+ }
+ wg.Wait()
+
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ for i, seqname := range seqnames {
+ log.Infof("writing outbuf %s", seqname)
+ io.Copy(out, &outbuf[i])
+ }
+ }()
+ if bedout != nil {
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ for i, seqname := range seqnames {
+ log.Infof("writing bedbuf %s", seqname)
+ io.Copy(bedout, &bedbuf[i])
+ }
+ }()
+ }
+ wg.Wait()
+ return nil
+}
+
+// Align genome tiles to reference tiles, write diffs to outw, and (if
+// bedw is not nil) write tile coverage to bedw.
+func (cmd *exporter) exportSeq(outw, bedw io.Writer, taglen int, seqname string, reftiles []tileLibRef, tileVariant map[tileLibRef]TileVariant, cgs []CompactGenome) {