+ 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)
+ }
+ }
+
+ // The bcftools --mask argument needs to end in ".bed"
+ // in order to be parsed as a BED file, so we need to
+ // use a named pipe instead of stdin.
+ tempdir, err := ioutil.TempDir("", "")
+ if err != nil {
+ return fmt.Errorf("TempDir: %s", err)
+ }
+ defer os.RemoveAll(tempdir)
+ maskfifo = filepath.Join(tempdir, "fifo.bed")
+ err = syscall.Mkfifo(maskfifo, 0600)
+ if err != nil {
+ return fmt.Errorf("mkfifo: %s", err)
+ }