htslib 0.0.10 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2ecf4c183a1720313371e493fbf7876a08d17639ad853b1d26faeff3addb7c6e
4
- data.tar.gz: cd1ed908a5dd8be184c8d9195c6fb5fabda5487d3c35e11476d9bd6d15c7dae8
3
+ metadata.gz: c90062954caa8dc2155f77ff3d03534d933ba81148f9bdb7c8dc173f73efca64
4
+ data.tar.gz: fb24ced637a8b9b897ecd9c5afed1c6f75902995e48c25daa849baa06611517b
5
5
  SHA512:
6
- metadata.gz: 4980914c7b92528055d2d0cf62fad6ca5edcde8ba1b9d426740538aee42fab53c7ef96ebe53adcaa9663368f024546c048b71760b68bd88e7cbb7647e200847c
7
- data.tar.gz: a94b5d01702cc9873fdf6d1498658cff15c44ba8c90b08cafe514a883560c6aaa90cfbd83cede8a4ae1a5095c6f99710e76a8aacb0e0851e628c607c37719bd5
6
+ metadata.gz: fed4e6689d48493416ebd409401df284fedaddb567d3558196b3ba3c253376dd1c4bea8db536fdb6ff8bbebe85512850d7d5c17605544ce26a09e814e7172eb5
7
+ data.tar.gz: b9d596e6445671254568b4bd3cc5b694a1011914ae67b1afc11aaa66a195f49b7371d001f9e10cc204a4c20e501cd8eb63092d63b9b392c701571a12843b5c91
data/README.md CHANGED
@@ -43,21 +43,21 @@ Read SAM / BAM / CRAM - Sequence Alignment Map file
43
43
  ```ruby
44
44
  require 'htslib'
45
45
 
46
- bam = HTS::Bam.open("a.bam")
46
+ bam = HTS::Bam.open("test/fixtures/moo.bam")
47
47
 
48
48
  bam.each do |r|
49
- p name: r.qname,
50
- flag: r.flag,
51
- chr: r.chrom,
52
- pos: r.start + 1,
53
- mqual: r.mapping_quality,
54
- cigar: r.cigar.to_s,
55
- mchr: r.mate_chrom,
56
- mpos: r.mate_start + 1,
57
- isize: r.insert_size,
58
- seq: r.sequence,
59
- qual: r.base_qualities.map { |i| (i + 33).chr }.join,
60
- tagMC: r.tag("MC")
49
+ pp name: r.qname,
50
+ flag: r.flag,
51
+ chrm: r.chrom,
52
+ strt: r.pos + 1,
53
+ mapq: r.mapq,
54
+ cigr: r.cigar.to_s,
55
+ mchr: r.mate_chrom,
56
+ mpos: r.mpos + 1,
57
+ isiz: r.isize,
58
+ seqs: r.seq,
59
+ qual: r.qual.map { |i| (i + 33).chr }.join,
60
+ MC: r.aux("MC")
61
61
  end
62
62
 
63
63
  bam.close
@@ -75,9 +75,9 @@ bcf.each do |r|
75
75
  qual: r.qual.round(2),
76
76
  ref: r.ref,
77
77
  alt: r.alt,
78
- filter: r.filter
79
- # info: r.info
80
- # format: r.format
78
+ filter: r.filter,
79
+ info: r.info.to_h,
80
+ format: r.format.to_h
81
81
  end
82
82
 
83
83
  bcf.close
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module HTS
4
+ class Bam < Hts
5
+ class Aux
6
+ def initialize(record)
7
+ @record = record
8
+ end
9
+
10
+ def get(key, type = nil)
11
+ aux = LibHTS.bam_aux_get(@record.struct, key)
12
+ return nil if aux.null?
13
+
14
+ type ||= aux.read_string(1)
15
+
16
+ # A (character), B (general array),
17
+ # f (real number), H (hexadecimal array),
18
+ # i (integer), or Z (string).
19
+
20
+ case type
21
+ when "i", "I", "c", "C", "s", "S"
22
+ LibHTS.bam_aux2i(aux)
23
+ when "f", "d"
24
+ LibHTS.bam_aux2f(aux)
25
+ when "Z", "H"
26
+ LibHTS.bam_aux2Z(aux)
27
+ when "A" # char
28
+ LibHTS.bam_aux2A(aux).chr
29
+ else
30
+ raise NotImplementedError, "type: #{t}"
31
+ end
32
+ end
33
+
34
+ def [](key)
35
+ get(key)
36
+ end
37
+ end
38
+ end
39
+ end
data/lib/hts/bam/cigar.rb CHANGED
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Based on hts-python
4
- # https://github.com/quinlan-lab/hts-python
5
-
6
3
  module HTS
7
4
  class Bam < Hts
8
5
  class Cigar
data/lib/hts/bam/flag.rb CHANGED
@@ -27,70 +27,34 @@ module HTS
27
27
  # BAM_FDUP = 1024
28
28
  # BAM_FSUPPLEMENTARY = 2048
29
29
 
30
- # TODO: Enabling bitwise operations
31
- # hts-nim
32
- # proc `and`*(f: Flag, o: uint16): uint16 {. borrow, inline .}
33
- # proc `and`*(f: Flag, o: Flag): uint16 {. borrow, inline .}
34
- # proc `or`*(f: Flag, o: uint16): uint16 {. borrow .}
35
- # proc `or`*(o: uint16, f: Flag): uint16 {. borrow .}
36
- # proc `==`*(f: Flag, o: Flag): bool {. borrow, inline .}
37
- # proc `==`*(f: Flag, o: uint16): bool {. borrow, inline .}
38
- # proc `==`*(o: uint16, f: Flag): bool {. borrow, inline .}
30
+ # TODO: Enabling bitwise operations?
39
31
 
40
- def paired?
41
- has_flag? LibHTS::BAM_FPAIRED
42
- end
43
-
44
- def proper_pair?
45
- has_flag? LibHTS::BAM_FPROPER_PAIR
46
- end
47
-
48
- def unmapped?
49
- has_flag? LibHTS::BAM_FUNMAP
50
- end
51
-
52
- def mate_unmapped?
53
- has_flag? LibHTS::BAM_FMUNMAP
54
- end
55
-
56
- def reverse?
57
- has_flag? LibHTS::BAM_FREVERSE
58
- end
59
-
60
- def mate_reverse?
61
- has_flag? LibHTS::BAM_FMREVERSE
62
- end
63
-
64
- def read1?
65
- has_flag? LibHTS::BAM_FREAD1
66
- end
67
-
68
- def read2?
69
- has_flag? LibHTS::BAM_FREAD2
70
- end
71
-
72
- def secondary?
73
- has_flag? LibHTS::BAM_FSECONDARY
74
- end
75
-
76
- def qcfail?
77
- has_flag? LibHTS::BAM_FQCFAIL
78
- end
79
-
80
- def dup?
81
- has_flag? LibHTS::BAM_FDUP
82
- end
32
+ TABLE = { paired?: LibHTS::BAM_FPAIRED,
33
+ proper_pair?: LibHTS::BAM_FPROPER_PAIR,
34
+ unmapped?: LibHTS::BAM_FUNMAP,
35
+ mate_unmapped?: LibHTS::BAM_FMUNMAP,
36
+ reverse?: LibHTS::BAM_FREVERSE,
37
+ mate_reverse?: LibHTS::BAM_FMREVERSE,
38
+ read1?: LibHTS::BAM_FREAD1,
39
+ read2?: LibHTS::BAM_FREAD2,
40
+ secondary?: LibHTS::BAM_FSECONDARY,
41
+ qcfail?: LibHTS::BAM_FQCFAIL,
42
+ duplicate?: LibHTS::BAM_FDUP,
43
+ supplementary?: LibHTS::BAM_FSUPPLEMENTARY }.freeze
83
44
 
84
- def supplementary?
85
- has_flag? LibHTS::BAM_FSUPPLEMENTARY
45
+ TABLE.each do |name, v|
46
+ define_method(name) do
47
+ has_flag?(v)
48
+ end
86
49
  end
87
50
 
88
- def has_flag?(m)
89
- (@value & m) != 0
51
+ def has_flag?(f)
52
+ (@value & f) != 0
90
53
  end
91
54
 
92
55
  def to_s
93
- "0x#{format('%x', @value)}\t#{@value}\t#{LibHTS.bam_flag2str(@value)}"
56
+ LibHTS.bam_flag2str(@value)
57
+ # "0x#{format('%x', @value)}\t#{@value}\t#{LibHTS.bam_flag2str(@value)}"
94
58
  end
95
59
  end
96
60
  end
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Based on hts-python
4
- # https://github.com/quinlan-lab/hts-python
5
-
6
3
  module HTS
7
4
  class Bam < Hts
8
5
  class Header
@@ -28,7 +25,7 @@ module HTS
28
25
  end
29
26
  end
30
27
 
31
- def target_lengths
28
+ def target_len
32
29
  Array.new(target_count) do |i|
33
30
  LibHTS.sam_hdr_tid2len(@sam_hdr, i)
34
31
  end
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Based on hts-python
4
- # https://github.com/quinlan-lab/hts-python
3
+ require_relative "flag"
4
+ require_relative "cigar"
5
+ require_relative "aux"
5
6
 
6
7
  module HTS
7
8
  class Bam < Hts
@@ -38,26 +39,49 @@ module HTS
38
39
  @bam1[:core][:tid]
39
40
  end
40
41
 
42
+ def tid=(tid)
43
+ @bam1[:core][:tid] = tid
44
+ end
45
+
41
46
  # returns the tid of the mate or -1 if not mapped.
42
- def mate_tid
47
+ def mtid
43
48
  @bam1[:core][:mtid]
44
49
  end
45
50
 
51
+ def mtid=(mtid)
52
+ @bam1[:core][:mtid] = mtid
53
+ end
54
+
46
55
  # returns 0-based start position.
47
- def start
56
+ def pos
48
57
  @bam1[:core][:pos]
49
58
  end
50
59
 
51
- # returns end position of the read.
52
- def stop
53
- LibHTS.bam_endpos @bam1
60
+ def pos=(pos)
61
+ @bam1[:core][:pos] = pos
54
62
  end
55
63
 
56
64
  # returns 0-based mate position
57
- def mate_start
65
+ def mpos
58
66
  @bam1[:core][:mpos]
59
67
  end
60
- alias mate_pos mate_start
68
+
69
+ def mpos=(mpos)
70
+ @bam1[:core][:mpos] = mpos
71
+ end
72
+
73
+ def bin
74
+ @bam1[:core][:bin]
75
+ end
76
+
77
+ def bin=(bin)
78
+ @bam1[:core][:bin] = bin
79
+ end
80
+
81
+ # returns end position of the read.
82
+ def endpos
83
+ LibHTS.bam_endpos @bam1
84
+ end
61
85
 
62
86
  # returns the chromosome or '' if not mapped.
63
87
  def chrom
@@ -66,37 +90,44 @@ module HTS
66
90
  LibHTS.sam_hdr_tid2name(@header, tid)
67
91
  end
68
92
 
69
- # returns the chromosome or '' if not mapped.
70
- def contig
71
- chrom
72
- end
93
+ alias contig chrom
73
94
 
74
95
  # returns the chromosome of the mate or '' if not mapped.
75
96
  def mate_chrom
76
- mtid = mate_tid
77
97
  return "" if mtid == -1
78
98
 
79
99
  LibHTS.sam_hdr_tid2name(@header, mtid)
80
100
  end
81
101
 
102
+ alias mate_contig mate_chrom
103
+
104
+ # Get strand information.
82
105
  def strand
83
106
  LibHTS.bam_is_rev(@bam1) ? "-" : "+"
84
107
  end
85
108
 
86
- # def start=(v)
87
- # raise 'Not Implemented'
88
- # end
89
-
90
109
  # insert size
91
110
  def insert_size
92
111
  @bam1[:core][:isize]
93
112
  end
94
113
 
114
+ alias isize insert_size
115
+
116
+ def insert_size=(isize)
117
+ @bam1[:core][:isize] = isize
118
+ end
119
+
120
+ alias isize= insert_size=
121
+
95
122
  # mapping quality
96
- def mapping_quality
123
+ def mapq
97
124
  @bam1[:core][:qual]
98
125
  end
99
126
 
127
+ def mapq=(mapq)
128
+ @bam1[:core][:qual] = mapq
129
+ end
130
+
100
131
  # returns a `Cigar` object.
101
132
  def cigar
102
133
  Cigar.new(LibHTS.bam_get_cigar(@bam1), @bam1[:core][:n_cigar])
@@ -117,7 +148,7 @@ module HTS
117
148
  end
118
149
 
119
150
  # return the read sequence
120
- def sequence
151
+ def seq
121
152
  r = LibHTS.bam_get_seq(@bam1)
122
153
  seq = String.new
123
154
  (@bam1[:core][:l_qseq]).times do |i|
@@ -125,64 +156,77 @@ module HTS
125
156
  end
126
157
  seq
127
158
  end
159
+ alias sequence seq
160
+
161
+ def len
162
+ @bam1[:core][:l_qseq]
163
+ end
128
164
 
129
165
  # return only the base of the requested index "i" of the query sequence.
130
- def base_at(n)
166
+ def base(n)
131
167
  n += @bam1[:core][:l_qseq] if n < 0
132
- return "." if (n >= @bam1[:core][:l_qseq]) || (n < 0) # eg. base_at(-1000)
168
+ return "." if (n >= @bam1[:core][:l_qseq]) || (n < 0) # eg. base(-1000)
133
169
 
134
170
  r = LibHTS.bam_get_seq(@bam1)
135
171
  SEQ_NT16_STR[LibHTS.bam_seqi(r, n)]
136
172
  end
137
173
 
138
174
  # return the base qualities
139
- def base_qualities
175
+ def qual
140
176
  q_ptr = LibHTS.bam_get_qual(@bam1)
141
177
  q_ptr.read_array_of_uint8(@bam1[:core][:l_qseq])
142
178
  end
143
179
 
144
180
  # return only the base quality of the requested index "i" of the query sequence.
145
- def base_quality_at(n)
181
+ def base_qual(n)
146
182
  n += @bam1[:core][:l_qseq] if n < 0
147
- return 0 if (n >= @bam1[:core][:l_qseq]) || (n < 0) # eg. base_quality_at(-1000)
183
+ return 0 if (n >= @bam1[:core][:l_qseq]) || (n < 0) # eg. base_qual(-1000)
148
184
 
149
185
  q_ptr = LibHTS.bam_get_qual(@bam1)
150
186
  q_ptr.get_uint8(n)
151
187
  end
152
188
 
153
- def flag_str
154
- LibHTS.bam_flag2str(@bam1[:core][:flag])
155
- end
156
-
157
189
  # returns a `Flag` object.
158
190
  def flag
159
191
  Flag.new(@bam1[:core][:flag])
160
192
  end
161
193
 
162
- def tag(str)
163
- aux = LibHTS.bam_aux_get(@bam1, str)
164
- return nil if aux.null?
194
+ def flag=(flag)
195
+ case flag
196
+ when Integer
197
+ @bam1[:core][:flag] = flag
198
+ when Flag
199
+ @bam1[:core][:flag] = flag.value
200
+ else
201
+ raise "Invalid flag type: #{flag.class}"
202
+ end
203
+ end
204
+
205
+ # retruns the auxillary fields.
206
+ def aux(key = nil)
207
+ aux = Aux.new(self)
208
+ if key
209
+ aux.get(key)
210
+ else
211
+ aux
212
+ end
213
+ end
214
+
215
+ # TODO: add a method to get the auxillary fields as a hash.
165
216
 
166
- t = aux.read_string(1)
217
+ # TODO: add a method to set the auxillary fields.
167
218
 
168
- # A (character), B (general array),
169
- # f (real number), H (hexadecimal array),
170
- # i (integer), or Z (string).
219
+ # TODO: add a method to remove the auxillary fields.
171
220
 
172
- case t
173
- when "i", "I", "c", "C", "s", "S"
174
- LibHTS.bam_aux2i(aux)
175
- when "f", "d"
176
- LibHTS.bam_aux2f(aux)
177
- when "Z", "H"
178
- LibHTS.bam_aux2Z(aux)
179
- when "A" # char
180
- LibHTS.bam_aux2A(aux).chr
221
+ # TODO: add a method to set variable length data (qname, cigar, seq, qual).
222
+
223
+ # Calling flag is delegated to the Flag object.
224
+ Flag::TABLE.each_key do |m|
225
+ define_method(m) do
226
+ flag.send(m)
181
227
  end
182
228
  end
183
229
 
184
- # def tags; end
185
-
186
230
  def to_s
187
231
  kstr = LibHTS::KString.new
188
232
  raise "Failed to format bam record" if LibHTS.sam_format1(@header.struct, @bam1, kstr) == -1
data/lib/hts/bam.rb CHANGED
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Based on hts-python
4
- # https://github.com/quinlan-lab/hts-python
5
-
6
3
  require_relative "../htslib"
7
4
 
8
5
  require_relative "hts"
@@ -15,7 +12,7 @@ module HTS
15
12
  class Bam
16
13
  include Enumerable
17
14
 
18
- attr_reader :file_name, :index_path, :mode, :header
15
+ attr_reader :file_name, :index_name, :mode, :header
19
16
 
20
17
  def self.open(*args, **kw)
21
18
  file = new(*args, **kw) # do not yield
@@ -38,9 +35,10 @@ module HTS
38
35
 
39
36
  # NOTE: Do not check for the existence of local files, since file_names may be remote URIs.
40
37
 
41
- @file_name = file_name
42
- @mode = mode
43
- @hts_file = LibHTS.hts_open(@file_name, mode)
38
+ @file_name = file_name
39
+ @index_name = index
40
+ @mode = mode
41
+ @hts_file = LibHTS.hts_open(@file_name, mode)
44
42
 
45
43
  raise Errno::ENOENT, "Failed to open #{@file_name}" if @hts_file.null?
46
44
 
@@ -66,11 +64,10 @@ module HTS
66
64
  end
67
65
 
68
66
  def create_index(index_name = nil)
67
+ warn "Create index for #{@file_name} to #{index_name}"
69
68
  if index
70
- warn "Create index for #{@file_name} to #{index_name}"
71
69
  LibHTS.sam_index_build2(@file_name, index_name, -1)
72
70
  else
73
- warn "Create index for #{@file_name} to #{index_name}"
74
71
  LibHTS.sam_index_build(@file_name, -1)
75
72
  end
76
73
  end
@@ -91,21 +88,20 @@ module HTS
91
88
  def close
92
89
  LibHTS.hts_idx_destroy(@idx) if @idx&.null?
93
90
  @idx = nil
94
- LibHTS.hts_close(@hts_file)
95
- @hts_file = nil
96
- end
97
-
98
- def closed?
99
- @hts_file.nil? || @hts_file.null?
91
+ super
100
92
  end
101
93
 
102
94
  def write_header(header)
95
+ raise IOError, "closed stream" if closed?
96
+
103
97
  @header = header.dup
104
98
  LibHTS.hts_set_fai_filename(@hts_file, @file_name)
105
99
  LibHTS.sam_hdr_write(@hts_file, header)
106
100
  end
107
101
 
108
102
  def write(aln)
103
+ raise IOError, "closed stream" if closed?
104
+
109
105
  aln_dup = aln.dup
110
106
  LibHTS.sam_write1(@hts_file, header, aln_dup) > 0 || raise
111
107
  end
@@ -114,6 +110,7 @@ module HTS
114
110
  # Generate a new Record object each time.
115
111
  # Slower than each.
116
112
  def each_copy
113
+ raise IOError, "closed stream" if closed?
117
114
  return to_enum(__method__) unless block_given?
118
115
 
119
116
  while LibHTS.sam_read1(@hts_file, header, bam1 = LibHTS.bam_init1) != -1
@@ -127,6 +124,7 @@ module HTS
127
124
  # Record object is reused.
128
125
  # Faster than each_copy.
129
126
  def each
127
+ raise IOError, "closed stream" if closed?
130
128
  # Each does not always start at the beginning of the file.
131
129
  # This is the common behavior of IO objects in Ruby.
132
130
  # This may change in the future.
@@ -140,6 +138,7 @@ module HTS
140
138
 
141
139
  # query [WIP]
142
140
  def query(region)
141
+ raise IOError, "closed stream" if closed?
143
142
  raise "Index file is required to call the query method." unless index_loaded?
144
143
 
145
144
  qiter = LibHTS.sam_itr_querys(@idx, header, region)
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # https://github.com/brentp/hts-nim/blob/master/src/hts/vcf.nim
4
- # This is a port from Nim.
5
- # TODO: Make it more like Ruby.
6
-
7
3
  module HTS
8
4
  class Bcf < Hts
9
5
  class Format
@@ -32,6 +28,10 @@ module HTS
32
28
  get(key, :string)
33
29
  end
34
30
 
31
+ def [](key)
32
+ get(key)
33
+ end
34
+
35
35
  def get(key, type = nil)
36
36
  n = FFI::MemoryPointer.new(:int)
37
37
  p1 = @p1
@@ -45,7 +45,15 @@ module HTS
45
45
  p1.read_pointer
46
46
  end
47
47
 
48
- case type.to_sym
48
+ # The GT FORMAT field is special in that it is marked as a string in the header,
49
+ # but it is actually encoded as an integer.
50
+ if key == "GT"
51
+ type = :int
52
+ elsif type.nil?
53
+ type = ht_type_to_sym(get_fmt_type(key))
54
+ end
55
+
56
+ case type&.to_sym
49
57
  when :int, :int32
50
58
  format_values.call(LibHTS::BCF_HT_INT)
51
59
  .read_array_of_int32(n.read_int)
@@ -53,22 +61,85 @@ module HTS
53
61
  format_values.call(LibHTS::BCF_HT_REAL)
54
62
  .read_array_of_float(n.read_int)
55
63
  when :flag
56
- raise NotImplementedError, "Flag type not implemented yet."
64
+ raise NotImplementedError, "Flag type not implemented yet. " \
65
+ "Please file an issue on GitHub."
57
66
  # format_values.call(LibHTS::BCF_HT_FLAG)
58
67
  # .read_int == 1
59
68
  when :string, :str
60
- raise NotImplementedError, "String type not implemented yet."
69
+ raise NotImplementedError, "String type not implemented yet. " \
70
+ "Please file an issue on GitHub."
61
71
  # format_values.call(LibHTS::BCF_HT_STR)
62
72
  # .read_string
63
73
  end
64
74
  end
65
75
 
66
- def set; end
76
+ def fields
77
+ ids.map do |id|
78
+ name = LibHTS.bcf_hdr_int2id(@record.header.struct, LibHTS::BCF_DT_ID, id)
79
+ num = LibHTS.bcf_hdr_id2number(@record.header.struct, LibHTS::BCF_HL_FMT, id)
80
+ type = LibHTS.bcf_hdr_id2type(@record.header.struct, LibHTS::BCF_HL_FMT, id)
81
+ {
82
+ name: name,
83
+ n: num,
84
+ type: ht_type_to_sym(type),
85
+ id: id
86
+ }
87
+ end
88
+ end
67
89
 
68
- # def fields # iterator
69
- # end
90
+ def length
91
+ @record.struct[:n_fmt]
92
+ end
93
+
94
+ def size
95
+ length
96
+ end
97
+
98
+ def to_h
99
+ ret = {}
100
+ ids.each do |id|
101
+ name = LibHTS.bcf_hdr_int2id(@record.header.struct, LibHTS::BCF_DT_ID, id)
102
+ ret[name] = get(name)
103
+ end
104
+ ret
105
+ end
70
106
 
71
- def genotypes; end
107
+ # def genotypes; end
108
+
109
+ private
110
+
111
+ def fmt_ptr
112
+ @record.struct[:d][:fmt].to_ptr
113
+ end
114
+
115
+ def ids
116
+ fmt_ptr.read_array_of_struct(LibHTS::BcfFmt, length).map do |fmt|
117
+ fmt[:id]
118
+ end
119
+ end
120
+
121
+ def get_fmt_type(qname)
122
+ @record.struct[:n_fmt].times do |i|
123
+ fmt = LibHTS::BcfFmt.new(@record.struct[:d][:fmt] + i * LibHTS::BcfFmt.size)
124
+ id = fmt[:id]
125
+ name = LibHTS.bcf_hdr_int2id(@record.header.struct, LibHTS::BCF_DT_ID, id)
126
+ if name == qname
127
+ type = LibHTS.bcf_hdr_id2type(@record.header.struct, LibHTS::BCF_HL_FMT, id)
128
+ return type
129
+ end
130
+ end
131
+ nil
132
+ end
133
+
134
+ def ht_type_to_sym(t)
135
+ case t
136
+ when LibHTS::BCF_HT_FLAG then :flag
137
+ when LibHTS::BCF_HT_INT then :int
138
+ when LibHTS::BCF_HT_REAL then :float
139
+ when LibHTS::BCF_HT_STR then :string
140
+ when LibHTS::BCF_HT_LONG then :float
141
+ end
142
+ end
72
143
  end
73
144
  end
74
145
  end