- var refseq []byte
- // tilestart[123] is the index into refseq
- // where the tile for tag 123 was placed.
- tilestart := map[tagID]int{}
- tileend := map[tagID]int{}
- for _, libref := range refcs.TileSequences[seqname] {
- if libref.Variant < 1 {
- return fmt.Errorf("reference %q seq %q uses variant zero at tag %d", refcs.Name, seqname, libref.Tag)
- }
- seq := tiles[libref.Tag][libref.Variant].Sequence
- if len(seq) < taglen {
- return fmt.Errorf("reference %q seq %q uses tile %d variant %d with sequence len %d < taglen %d", refcs.Name, seqname, libref.Tag, libref.Variant, len(seq), taglen)
- }
- overlap := taglen
- if len(refseq) == 0 {
- overlap = 0
- }
- tilestart[libref.Tag] = len(refseq) - overlap
- refseq = append(refseq, seq[overlap:]...)
- tileend[libref.Tag] = len(refseq)
+ throttle.Acquire()
+ go func() {
+ defer throttle.Release()
+ throttle.Report(cmd.annotateSequence(throttle, outch, tilelib, taglen, refname, seqname, refcs[seqname], len(refs) > 1))
+ }()
+ }
+ }
+ throttle.Wait()
+ return throttle.Err()
+}
+
+func (cmd *annotatecmd) annotateSequence(throttle *throttle, outch chan<- string, tilelib *tileLibrary, taglen int, refname, seqname string, reftiles []tileLibRef, refnamecol bool) error {
+ var refseq []byte
+ // tilestart[123] is the index into refseq
+ // where the tile for tag 123 was placed.
+ tilestart := map[tagID]int{}
+ tileend := map[tagID]int{}
+ for _, libref := range reftiles {
+ if libref.Variant < 1 {
+ return fmt.Errorf("reference %q seq %q uses variant zero at tag %d", refname, seqname, libref.Tag)
+ }
+ seq := tilelib.TileVariantSequence(libref)
+ if len(seq) < taglen {
+ return fmt.Errorf("reference %q seq %q uses tile %d variant %d with sequence len %d < taglen %d", refname, seqname, libref.Tag, libref.Variant, len(seq), taglen)
+ }
+ overlap := taglen
+ if len(refseq) == 0 {
+ overlap = 0
+ }
+ tilestart[libref.Tag] = len(refseq) - overlap
+ refseq = append(refseq, seq[overlap:]...)
+ tileend[libref.Tag] = len(refseq)
+ }
+ log.Infof("seq %s len(refseq) %d len(tilestart) %d", seqname, len(refseq), len(tilestart))
+ for tag, tvs := range tilelib.variant {
+ tag := tagID(tag)
+ refstart, ok := tilestart[tag]
+ if !ok {
+ // Tag didn't place on this
+ // reference sequence. (It
+ // might place on the same
+ // chromosome in a genome
+ // anyway, but we don't output
+ // the annotations that would
+ // result.)
+ continue
+ }
+ for variant := 1; variant <= len(tvs); variant++ {
+ variant, hash := tileVariantID(variant), tvs[variant-1]
+ tileseq := tilelib.TileVariantSequence(tileLibRef{Tag: tag, Variant: variant})
+ if len(tileseq) == 0 {
+ continue
+ } else if len(tileseq) < taglen {
+ return fmt.Errorf("tilevar %d,%d has sequence len %d < taglen %d", tag, variant, len(tileseq), taglen)