+ bed.Stdout = ®ions
+ bed.Stderr = cmd.stderr
+ log.Printf("running %v", bed.Args)
+ err = bed.Run()
+ log.Printf("exited %v", bed.Args)
+ if err != nil {
+ return fmt.Errorf("gvcf_regions: %s", err)
+ }
+
+ if cmd.genomeFile != "" {
+ // Read chromosome sizes from genome file in
+ // case any weren't specified in the VCF
+ // header.
+ genomeFile, err := open(cmd.genomeFile)
+ if err != nil {
+ return fmt.Errorf("error opening genome file %q: %s", cmd.genomeFile, err)
+ }
+ scanner := bufio.NewScanner(genomeFile)
+ for scanner.Scan() {
+ var chr string
+ var size int
+ _, err := fmt.Sscanf(scanner.Text(), "%s\t%d", &chr, &size)
+ if err != nil {
+ return fmt.Errorf("error parsing genome file %q: %s", cmd.genomeFile, err)
+ }
+ if chrSize[chr] == 0 {
+ chrSize[chr] = size
+ }
+ }
+ if err = scanner.Err(); err != nil {
+ return fmt.Errorf("error scanning genome file %q: %s", cmd.genomeFile, err)
+ }
+ }
+
+ // "bedtools complement" expects the chromosome sizes
+ // ("genome file") to appear in the same order as the
+ // chromosomes in the input vcf, so we need to sort
+ // them.
+ scanner = bufio.NewScanner(bytes.NewBuffer(append([]byte(nil), regions.Bytes()...)))
+ var sortedGenomeFile bytes.Buffer
+ for scanner.Scan() {
+ var chr string
+ var size int
+ _, err := fmt.Sscanf(scanner.Text(), "%s\t%d", &chr, &size)
+ if err != nil {
+ return fmt.Errorf("error parsing gvcf_regions output: %s", err)
+ }
+ if size, ok := chrSize[chr]; ok {
+ fmt.Fprintf(&sortedGenomeFile, "%s\t%d\n", chr, size)
+ delete(chrSize, chr)
+ }
+ }