File: writer.go

package info (click to toggle)
golang-github-brentp-vcfgo 0.0~git20190824.654ed2e-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 2,924 kB
  • sloc: makefile: 5; sh: 1
file content (93 lines) | stat: -rw-r--r-- 1,779 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package vcfgo

import (
	"fmt"
	"io"
	"sort"
	"strings"
)

// Writer allows writing VCF files.
type Writer struct {
	io.Writer
	Header *Header
}

// NewWriter returns a writer after writing the header.
func NewWriter(w io.Writer, h *Header) (*Writer, error) {
	fmt.Fprintf(w, "##fileformat=VCFv%s\n", h.FileFormat)

	for _, imap := range h.Contigs {
		fmt.Fprintf(w, "##contig=<ID=%s", imap["ID"])

		for k, v := range imap {
			if k == "ID" {
				continue
			}

			fmt.Fprintf(w, ",%s=%s", k, v)
		}
		fmt.Fprintln(w, ">")
	}

	// Samples
	keys := make([]string, 0, len(h.Samples))
	for sampleId := range h.Samples {
		keys = append(keys, sampleId)
	}
	sort.Strings(keys)
	for _, sampleId := range keys {
		fmt.Fprintln(w, h.Samples[sampleId])
	}

	for i := range h.Pedigrees {
		fmt.Fprintln(w, h.Pedigrees[i])
	}

	// Filters
	keys = keys[:0]
	for k := range h.Filters {
		keys = append(keys, k)
	}
	sort.Strings(keys)
	for _, k := range keys {
		fmt.Fprintf(w, "##FILTER=<ID=%s,Description=\"%s\">\n", k, h.Filters[k])
	}

	// Infos
	keys = keys[:0]
	for k := range h.Infos {
		keys = append(keys, k)
	}
	sort.Strings(keys)
	for _, k := range keys {
		fmt.Fprintf(w, "%s\n", h.Infos[k])
	}

	// SampleFormats
	keys = keys[:0]
	for k := range h.SampleFormats {
		keys = append(keys, k)
	}
	sort.Strings(keys)
	for _, k := range keys {
		fmt.Fprintf(w, "%s\n", h.SampleFormats[k])
	}
	for _, line := range h.Extras {
		fmt.Fprintf(w, "%s\n", line)
	}

	fmt.Fprint(w, "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT")
	var s string
	if len(h.SampleNames) > 0 {
		s = "\t" + strings.Join(h.SampleNames, "\t")
	}

	fmt.Fprint(w, s+"\n")
	return &Writer{w, h}, nil
}

// WriteVariant writes a single variant
func (w *Writer) WriteVariant(v *Variant) {
	fmt.Fprintln(w, v)
}