htslib 0.2.8 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: caaf2dd527c9570e2e4c72b22e5252a1ef69adbf983fbfe3e815c3a9bc1b91c0
4
- data.tar.gz: b7e0b6ecf736142ea9b43e4ed7f80513b1c0d002ea40b2565e218be3a40d2fac
3
+ metadata.gz: c98f3937d65f091e9e834060f3a94578034d1bf55e7bc372e5ed388e618a6da4
4
+ data.tar.gz: 8e180044fef210935695bc60c0352b747b570b705f3ce9318b7538d19ddaf645
5
5
  SHA512:
6
- metadata.gz: 6fe725489c93915fc5afa5d58dd2a5a0030b82546f473b6cae4245898b01f60919494d64b31f3442c3ea316a25fb31c0b46cfdd447230c253c21818ca3da9fb8
7
- data.tar.gz: f5bed585f7bded73022ea0ad9a1dc2eb6a10c13e63772cac267a3c23497b521d82d5ab82763e512b452d47f59be8c47dcf5ff2046c96dcc492604931799cf2b2
6
+ metadata.gz: 5324913bdbe97580fee1e54b6268f22aed2a0b84d449c8a4f62529981c82a57d6ae5cea7cc77ff1be7332425eea259bfe5daa1107b6144e36ef40bb4997dd28f
7
+ data.tar.gz: 7b230700951223aeda09d64fac7cca44d734d54ec03a7836c5a0fb036e552854db80b9ecaf57aa478e317c684e4712f2f03244e02474fd2ea53a4b93346d1371
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # ruby-htslib
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/htslib.svg)](https://badge.fury.io/rb/htslib)
4
- ![CI](https://github.com/kojix2/ruby-htslib/workflows/CI/badge.svg)
4
+ [![test](https://github.com/kojix2/ruby-htslib/actions/workflows/ci.yml/badge.svg)](https://github.com/kojix2/ruby-htslib/actions/workflows/ci.yml)
5
5
  [![The MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE.txt)
6
6
  [![DOI](https://zenodo.org/badge/247078205.svg)](https://zenodo.org/badge/latestdoi/247078205)
7
7
  [![Docs Stable](https://img.shields.io/badge/docs-stable-blue.svg)](https://rubydoc.info/gems/htslib)
data/lib/hts/bam/auxi.rb CHANGED
@@ -30,10 +30,10 @@ module HTS
30
30
  # which provides methods like `get_int`, `get_float`, etc.
31
31
  # I think they are better than `fetch_int`` and `fetch_float`.
32
32
  def get(key, type = nil)
33
- aux = LibHTS.bam_aux_get(@record.struct, key)
34
- return nil if aux.null?
33
+ aux_ptr = LibHTS.bam_aux_get(@record.struct, key)
34
+ return nil if aux_ptr.null?
35
35
 
36
- get_ruby_aux(aux, type)
36
+ get_ruby_aux(aux_ptr, type)
37
37
  end
38
38
 
39
39
  # For compatibility with HTS.cr.
@@ -56,43 +56,47 @@ module HTS
56
56
  end
57
57
 
58
58
  def first
59
- aux = LibHTS.bam_aux_first(@record.struct)
60
- return nil if aux.null?
59
+ aux_ptr = first_pointer
60
+ return nil if aux_ptr.null?
61
61
 
62
- get_ruby_aux(aux)
62
+ get_ruby_aux(aux_ptr)
63
63
  end
64
64
 
65
65
  def each
66
66
  return enum_for(__method__) unless block_given?
67
67
 
68
- aux = LibHTS.bam_aux_first(@record.struct)
69
- return nil if aux.null?
68
+ aux_ptr = first_pointer
69
+ return nil if aux_ptr.null?
70
70
 
71
71
  loop do
72
- yield get_ruby_aux(aux)
73
- aux = LibHTS.bam_aux_next(@record.struct, aux)
74
- break if aux.null?
72
+ yield get_ruby_aux(aux_ptr)
73
+ aux_ptr = LibHTS.bam_aux_next(@record.struct, aux_ptr)
74
+ break if aux_ptr.null?
75
75
  end
76
76
  end
77
77
 
78
78
  def to_h
79
79
  h = {}
80
- aux = LibHTS.bam_aux_first(@record.struct)
81
- return h if aux.null?
80
+ aux_ptr = first_pointer
81
+ return h if aux_ptr.null?
82
82
 
83
83
  loop do
84
- key = FFI::Pointer.new(aux.address - 2).read_string(2)
85
- h[key] = get_ruby_aux(aux)
86
- aux = LibHTS.bam_aux_next(@record.struct, aux)
87
- break if aux.null?
84
+ key = FFI::Pointer.new(aux_ptr.address - 2).read_string(2)
85
+ h[key] = get_ruby_aux(aux_ptr)
86
+ aux_ptr = LibHTS.bam_aux_next(@record.struct, aux_ptr)
87
+ break if aux_ptr.null?
88
88
  end
89
89
  h
90
90
  end
91
91
 
92
92
  private
93
93
 
94
- def get_ruby_aux(aux, type = nil)
95
- type = type ? type.to_s : aux.read_string(1)
94
+ def first_pointer
95
+ LibHTS.bam_aux_first(@record.struct)
96
+ end
97
+
98
+ def get_ruby_aux(aux_ptr, type = nil)
99
+ type = type ? type.to_s : aux_ptr.read_string(1)
96
100
 
97
101
  # A (character), B (general array),
98
102
  # f (real number), H (hexadecimal array),
@@ -100,23 +104,23 @@ module HTS
100
104
 
101
105
  case type
102
106
  when "i", "I", "c", "C", "s", "S"
103
- LibHTS.bam_aux2i(aux)
107
+ LibHTS.bam_aux2i(aux_ptr)
104
108
  when "f", "d"
105
- LibHTS.bam_aux2f(aux)
109
+ LibHTS.bam_aux2f(aux_ptr)
106
110
  when "Z", "H"
107
- LibHTS.bam_aux2Z(aux)
111
+ LibHTS.bam_aux2Z(aux_ptr)
108
112
  when "A" # char
109
- LibHTS.bam_aux2A(aux).chr
113
+ LibHTS.bam_aux2A(aux_ptr).chr
110
114
  when "B" # array
111
- t2 = aux.read_string(2)[1] # just a little less efficient
112
- l = LibHTS.bam_auxB_len(aux)
115
+ t2 = aux_ptr.read_string(2)[1] # just a little less efficient
116
+ l = LibHTS.bam_auxB_len(aux_ptr)
113
117
  case t2
114
118
  when "c", "C", "s", "S", "i", "I"
115
119
  # FIXME : Not efficient.
116
- Array.new(l) { |i| LibHTS.bam_auxB2i(aux, i) }
120
+ Array.new(l) { |i| LibHTS.bam_auxB2i(aux_ptr, i) }
117
121
  when "f", "d"
118
122
  # FIXME : Not efficient.
119
- Array.new(l) { |i| LibHTS.bam_auxB2f(aux, i) }
123
+ Array.new(l) { |i| LibHTS.bam_auxB2f(aux_ptr, i) }
120
124
  else
121
125
  raise NotImplementedError, "type: #{type} #{t2}"
122
126
  end
data/lib/hts/bam/flag.rb CHANGED
@@ -69,27 +69,29 @@ module HTS
69
69
  end
70
70
 
71
71
  def &(other)
72
- Flag.new(@value & other.to_i)
72
+ self.class.new(@value & other.to_i)
73
73
  end
74
74
 
75
75
  def |(other)
76
- Flag.new(@value | other.to_i)
76
+ self.class.new(@value | other.to_i)
77
77
  end
78
78
 
79
79
  def ^(other)
80
- Flag.new(@value ^ other.to_i)
80
+ self.class.new(@value ^ other.to_i)
81
81
  end
82
82
 
83
83
  def ~
84
- Flag.new(~@value)
84
+ # FIXME: Only 12bits are used for flags
85
+ # The result is different from the Crystal version.
86
+ self.class.new(~@value)
85
87
  end
86
88
 
87
89
  def <<(f)
88
- Flag.new(@value << f.to_i)
90
+ self.class.new(@value << f.to_i)
89
91
  end
90
92
 
91
93
  def >>(other)
92
- Flag.new(@value >> other.to_i)
94
+ self.class.new(@value >> other.to_i)
93
95
  end
94
96
 
95
97
  def to_i
@@ -6,8 +6,8 @@ module HTS
6
6
  class Bam < Hts
7
7
  # A class for working with alignment header.
8
8
  class Header
9
- def self.parse(str)
10
- new(LibHTS.sam_hdr_parse(str.size, str))
9
+ def self.parse(text)
10
+ new(LibHTS.sam_hdr_parse(text.size, text))
11
11
  end
12
12
 
13
13
  def initialize(arg = nil)
@@ -21,6 +21,8 @@ module HTS
21
21
  else
22
22
  raise TypeError, "Invalid argument"
23
23
  end
24
+
25
+ yield self if block_given?
24
26
  end
25
27
 
26
28
  def struct
@@ -31,11 +33,23 @@ module HTS
31
33
  @sam_hdr.to_ptr
32
34
  end
33
35
 
36
+ def targets
37
+ Array.new(target_count) do |i|
38
+ name = LibHTS.sam_hdr_tid2name(@sam_hdr, i)
39
+ len = LibHTS.sam_hdr_tid2len(@sam_hdr, i)
40
+ { name:, len: }
41
+ end
42
+ end
43
+
34
44
  def target_count
35
45
  # FIXME: sam_hdr_nref
36
46
  @sam_hdr[:n_targets]
37
47
  end
38
48
 
49
+ def target_name(tid)
50
+ tid2name(tid)
51
+ end
52
+
39
53
  def target_names
40
54
  Array.new(target_count) do |i|
41
55
  LibHTS.sam_hdr_tid2name(@sam_hdr, i)
@@ -48,15 +62,20 @@ module HTS
48
62
  end
49
63
  end
50
64
 
51
- # experimental
52
- def add_lines(str)
53
- LibHTS.sam_hdr_add_lines(@sam_hdr, str, 0)
65
+ def write(...)
66
+ add_lines(...)
54
67
  end
55
68
 
56
69
  # experimental
57
- def add_line(type, *args)
58
- args = args.flat_map { |arg| [:string, arg] }
59
- LibHTS.sam_hdr_add_line(@sam_hdr, type, *args, :pointer, FFI::Pointer::NULL)
70
+ def <<(obj)
71
+ case obj
72
+ when Array, Hash
73
+ args = obj.flatten(-1).map { |i| i.to_a if i.is_a?(Hash) }
74
+ add_line(*args)
75
+ else
76
+ add_lines(obj.to_s)
77
+ end
78
+ self
60
79
  end
61
80
 
62
81
  # experimental
@@ -87,6 +106,13 @@ module HTS
87
106
  LibHTS.sam_hdr_str(@sam_hdr)
88
107
  end
89
108
 
109
+ # experimental
110
+ def get_tid(name)
111
+ name2tid(name)
112
+ end
113
+
114
+ private
115
+
90
116
  def name2tid(name)
91
117
  LibHTS.sam_hdr_name2tid(@sam_hdr, name)
92
118
  end
@@ -95,7 +121,15 @@ module HTS
95
121
  LibHTS.sam_hdr_tid2name(@sam_hdr, tid)
96
122
  end
97
123
 
98
- private
124
+ def add_lines(str)
125
+ LibHTS.sam_hdr_add_lines(@sam_hdr, str, 0)
126
+ end
127
+
128
+ def add_line(*args)
129
+ type = args.shift
130
+ args = args.flat_map { |arg| [:string, arg] }
131
+ LibHTS.sam_hdr_add_line(@sam_hdr, type, *args, :pointer, FFI::Pointer::NULL)
132
+ end
99
133
 
100
134
  def initialize_copy(orig)
101
135
  @sam_hdr = LibHTS.sam_hdr_dup(orig.struct)
@@ -12,9 +12,64 @@ module HTS
12
12
 
13
13
  attr_reader :header
14
14
 
15
- def initialize(header, bam1_t = nil)
16
- @bam1 = bam1_t || LibHTS.bam_init1
15
+ # Initialization API is experimental.
16
+
17
+ def initialize(
18
+ header,
19
+ bam1 = nil,
20
+ qname: nil,
21
+ flag: nil,
22
+ tid: nil,
23
+ pos: nil,
24
+ mapq: nil,
25
+ cigar: nil,
26
+ mtid: nil,
27
+ mpos: nil,
28
+ isize: nil,
29
+ seq: nil,
30
+ qual: nil,
31
+ l_aux: nil
32
+ )
33
+ @bam1 = bam1 || LibHTS.bam_init1
17
34
  @header = header
35
+
36
+ params = [qname, flag, tid, pos, mapq, cigar, mtid, mpos, isize, seq, qual, l_aux]
37
+ return if params.all? { |x| x.nil? }
38
+
39
+ if params.all?
40
+ c = FFI::MemoryPointer.new(:pointer)
41
+ m = FFI::MemoryPointer.new(:size_t)
42
+ LibHTS.sam_parse_cigar(cigar, FFI::Pointer::NULL, c, m)
43
+ cigar_array = c.read_pointer.read_array_of_uint32(m.read(:size_t))
44
+ cigar_pointer = FFI::MemoryPointer.new(:uint32, cigar_array.length)
45
+ cigar_pointer.write_array_of_uint32(cigar_array)
46
+ if qual.is_a?(Array)
47
+ qual = qual.pack("C*")
48
+ elsif qual.is_a?(String)
49
+ raise "Which implementation is better? +33 or not? Please tell me."
50
+ end
51
+ r = LibHTS.bam_set1(
52
+ @bam1,
53
+ qname.length,
54
+ qname,
55
+ flag,
56
+ tid,
57
+ pos,
58
+ mapq,
59
+ cigar_array.length,
60
+ cigar_pointer,
61
+ mtid,
62
+ mpos,
63
+ isize,
64
+ seq.length,
65
+ seq,
66
+ qual,
67
+ l_aux
68
+ )
69
+ raise "bam_set1 failed: #{r}" if r < 0
70
+ else
71
+ warn "Ignore bam_set1 because some arguments are missing."
72
+ end
18
73
  end
19
74
 
20
75
  # Return the FFI::Struct object.
@@ -158,6 +213,17 @@ module HTS
158
213
  Cigar.new(self)
159
214
  end
160
215
 
216
+ def cigar=(str)
217
+ if cigar.is_a? Cigar
218
+ raise "Not implemented yet."
219
+ elsif cigar.is_a? String
220
+ r = LibHTS.bam_parse_cigar(str, FFI::Pointer::NULL, @bam1)
221
+ raise "bam_parse_cigar failed: #{r}" if r != 0
222
+ else
223
+ raise ArgumentError, "cigar must be a String or Bam::Cigar"
224
+ end
225
+ end
226
+
161
227
  # Calculate query length from CIGAR.
162
228
  # @return [Integer] query length
163
229
  def qlen
data/lib/hts/bam.rb CHANGED
@@ -194,7 +194,7 @@ module HTS
194
194
  raise "Index file is required to call the query method." unless index_loaded?
195
195
 
196
196
  if beg && end_
197
- tid = header.name2tid(region)
197
+ tid = header.get_tid(region)
198
198
  queryi(tid, beg, end_, copy:, &block)
199
199
  elsif beg.nil? && end_.nil?
200
200
  querys(region, copy:, &block)
@@ -19,6 +19,8 @@ module HTS
19
19
  else
20
20
  raise TypeError, "Invalid argument"
21
21
  end
22
+
23
+ yield self if block_given?
22
24
  end
23
25
 
24
26
  def struct
data/lib/hts/bcf.rb CHANGED
@@ -185,7 +185,7 @@ module HTS
185
185
 
186
186
  def each_info(key)
187
187
  check_closed
188
- return to_enum(__method__, key) unless block
188
+ return to_enum(__method__, key) unless block_given?
189
189
 
190
190
  each do |r|
191
191
  yield r.info(key)
@@ -194,7 +194,7 @@ module HTS
194
194
 
195
195
  def each_format(key)
196
196
  check_closed
197
- return to_enum(__method__, key) unless block
197
+ return to_enum(__method__, key) unless block_given?
198
198
 
199
199
  each do |r|
200
200
  yield r.format(key)
@@ -570,5 +570,18 @@ module HTS
570
570
  :external, 4,
571
571
  :core, 5
572
572
  )
573
+
574
+ CramBlockMethod = enum(
575
+ :unknown, -1,
576
+ :raw, 0,
577
+ :gzip, 1,
578
+ :bzip2, 2,
579
+ :lzma, 3,
580
+ :rans4x8, 4,
581
+ :ransnx16, 5,
582
+ :arith, 6,
583
+ :fqz, 7,
584
+ :tok3, 8
585
+ )
573
586
  end
574
587
  end
@@ -79,12 +79,27 @@ module HTS
79
79
  %i[cram_container int32 pointer],
80
80
  :void
81
81
 
82
+ attach_function \
83
+ :cram_container_get_num_records,
84
+ [:cram_container],
85
+ :int32
86
+
87
+ attach_function \
88
+ :cram_container_get_num_bases,
89
+ [:cram_container],
90
+ :int32
91
+
92
+ # Returns true if the container is empty (EOF marker)
82
93
  attach_function \
83
94
  :cram_container_is_empty,
84
95
  [:cram_fd],
85
96
  :int
86
97
 
87
- # cram_block
98
+ # Returns chromosome and start/span from container struct
99
+ attach_function \
100
+ :cram_container_get_coords,
101
+ %i[cram_container pointer pointer],
102
+ :void
88
103
 
89
104
  attach_function \
90
105
  :cram_block_get_content_id,
@@ -116,6 +131,16 @@ module HTS
116
131
  [:cram_block],
117
132
  CramContentType
118
133
 
134
+ attach_function \
135
+ :cram_block_get_method,
136
+ [:cram_block],
137
+ CramBlockMethod
138
+
139
+ attach_function \
140
+ :cram_expand_method,
141
+ [:pointer, :int32, CramBlockMethod],
142
+ :pointer
143
+
119
144
  attach_function \
120
145
  :cram_block_set_content_id,
121
146
  %i[cram_block int32],
@@ -167,6 +192,18 @@ module HTS
167
192
  [:cram_block],
168
193
  :uint32
169
194
 
195
+ # Returns the Block Content ID values referred to by a cram_codec in ids[2].
196
+ attach_function \
197
+ :cram_codec_get_content_ids,
198
+ %i[pointer pointer],
199
+ :void
200
+
201
+ # Produces a human readable description of the codec parameters.
202
+ attach_function \
203
+ :cram_codec_describe,
204
+ [:pointer, KString.ptr],
205
+ :int
206
+
170
207
  # Renumbers RG numbers in a cram compression header.
171
208
  attach_function \
172
209
  :cram_transcode_rg,
@@ -180,6 +217,51 @@ module HTS
180
217
  %i[cram_fd cram_fd int32],
181
218
  :int
182
219
 
220
+ # Copies a container, but filtering it down to a specific region (as
221
+ # already specified in 'in'
222
+ attach_function \
223
+ :cram_filter_container,
224
+ %i[cram_fd cram_fd cram_container pointer],
225
+ :int
226
+
227
+ # Decodes a CRAM block compression header.
228
+ attach_function \
229
+ :cram_decode_compression_header,
230
+ %i[cram_fd cram_block],
231
+ :pointer # cram_block_compression_hdr
232
+
233
+ # Frees a cram_block_compression_hdr structure.
234
+ attach_function \
235
+ :cram_free_compression_header,
236
+ [:pointer],
237
+ :void
238
+
239
+ # Map cram block numbers to data-series.
240
+ attach_function \
241
+ :cram_update_cid2ds_map,
242
+ %i[pointer pointer],
243
+ :pointer
244
+
245
+ # Return a list of data series observed as belonging to a block with
246
+ # the specified content_id.
247
+ attach_function \
248
+ :cram_cid2ds_query,
249
+ %i[pointer int pointer],
250
+ :int
251
+
252
+ # Frees a cram_cid2ds_t allocated by cram_update_cid2ds_map
253
+ attach_function \
254
+ :cram_cid2ds_free,
255
+ [:pointer],
256
+ :void
257
+
258
+ # Produces a description of the record and tag encodings held within
259
+ # a compression header and appends to 'ks'.
260
+ attach_function \
261
+ :cram_describe_encodings,
262
+ [:pointer, KString.ptr],
263
+ :int
264
+
183
265
  # Returns the number of cram blocks within this slice.
184
266
  attach_function \
185
267
  :cram_slice_hdr_get_num_blocks,
@@ -360,5 +442,35 @@ module HTS
360
442
  :cram_get_refs,
361
443
  [HtsFile.by_ref],
362
444
  :pointer # refs_t
445
+
446
+ # Returns the file offsets of CRAM slices covering a specific region query.
447
+ attach_function \
448
+ :cram_index_extents,
449
+ %i[cram_fd int hts_pos_t hts_pos_t pointer pointer],
450
+ :int
451
+
452
+ # Returns the total number of containers in the CRAM index.
453
+ attach_function \
454
+ :cram_num_containers,
455
+ [:cram_fd],
456
+ :int64
457
+
458
+ # Returns the number of containers in the CRAM index within given offsets.
459
+ attach_function \
460
+ :cram_num_containers_between,
461
+ %i[cram_fd off_t off_t pointer pointer],
462
+ :int64
463
+
464
+ # Returns the byte offset for the start of the n^th container.
465
+ attach_function \
466
+ :cram_container_num2offset,
467
+ %i[cram_fd int64],
468
+ :off_t
469
+
470
+ # Returns the container number for the first container at offset >= pos.
471
+ attach_function \
472
+ :cram_container_offset2num,
473
+ %i[cram_fd off_t],
474
+ :int64
363
475
  end
364
476
  end
@@ -447,7 +447,7 @@ module HTS
447
447
  # Computes the final 128-bit MD5 hash from the given context
448
448
  attach_function \
449
449
  :hts_md5_final,
450
- %i[pointer pointer], # unsinged char
450
+ %i[pointer pointer], # unsigned char
451
451
  :void
452
452
 
453
453
  # Resets an md5_context to the initial state, as returned by hts_md5_init().
@@ -247,7 +247,7 @@ module HTS
247
247
  :hts_pos_t,
248
248
  :uint8,
249
249
  :size_t,
250
- :string,
250
+ :pointer,
251
251
  :int32,
252
252
  :hts_pos_t,
253
253
  :hts_pos_t,
@@ -512,6 +512,12 @@ module HTS
512
512
  [Bam1, :pointer],
513
513
  :int
514
514
 
515
+ # Delete an aux field from a BAM record. Identical to @c bam_aux_del() apart from the return value
516
+ attach_function \
517
+ :bam_aux_remove,
518
+ [Bam1, :pointer],
519
+ :pointer
520
+
515
521
  # Update or add a string-type tag
516
522
  attach_function \
517
523
  :bam_aux_update_str,
@@ -674,12 +680,18 @@ module HTS
674
680
  [:pointer], # hts_base_mod_state
675
681
  :void
676
682
 
677
- # Parses the Mm and Ml tags out of a bam record.
683
+ # Parses the MM and ML tags out of a bam record.
678
684
  attach_function \
679
685
  :bam_parse_basemod,
680
686
  [Bam1, :pointer],
681
687
  :int
682
688
 
689
+ # Parses the MM and ML tags out of a bam record.
690
+ attach_function \
691
+ :bam_parse_basemod2,
692
+ [Bam1, :pointer, :uint32],
693
+ :int
694
+
683
695
  # Returns modification status for the next base position in the query seq.
684
696
  attach_function \
685
697
  :bam_mods_at_next_pos,
@@ -704,6 +716,12 @@ module HTS
704
716
  %i[pointer int pointer pointer string],
705
717
  :int
706
718
 
719
+ # Returns data about the i^th modification type for the alignment record.
720
+ attach_function \
721
+ :bam_mods_queryi,
722
+ %i[pointer int pointer pointer string],
723
+ :int
724
+
707
725
  # Returns the list of base modification codes provided for this
708
726
  attach_function \
709
727
  :bam_mods_recorded,
@@ -2,6 +2,13 @@
2
2
 
3
3
  module HTS
4
4
  module LibHTS
5
+ attach_variable :tbx_conf_gff, TbxConf
6
+ attach_variable :tbx_conf_bed, TbxConf
7
+ attach_variable :tbx_conf_psltbl, TbxConf
8
+ attach_variable :tbx_conf_sam, TbxConf
9
+ attach_variable :tbx_conf_vcf, TbxConf
10
+ attach_variable :tbx_conf_gaf, TbxConf
11
+
5
12
  attach_function \
6
13
  :tbx_name2id,
7
14
  [Tbx, :string],
@@ -8,11 +8,16 @@ module HTS
8
8
  end
9
9
 
10
10
  def tbx_itr_queryi(tbx, tid, beg, end_)
11
- hts_itr_query(tbx[:idx], tid, beg, end_, @@tbx_readrec)
11
+ hts_itr_query(tbx[:idx], tid, beg, end_, @ffi_functions[:tbx_readrec])
12
+ end
13
+
14
+ @@tbx_name2id = proc do |tbx, ss|
15
+ LibHTS.tbx_name2id(tbx, ss)
12
16
  end
13
17
 
14
18
  def tbx_itr_querys(tbx, s)
15
- hts_itr_querys(tbx[:idx], s, @@tbx_name2id, tbx, @@hts_itr_query, @@tbx_readrec)
19
+ hts_itr_querys(tbx[:idx], s, @@tbx_name2id, tbx, @ffi_functions[:hts_itr_query],
20
+ @ffi_functions[:tbx_readrec])
16
21
  end
17
22
 
18
23
  def tbx_itr_next(htsfp, tbx, itr, r)
@@ -2,6 +2,12 @@
2
2
 
3
3
  module HTS
4
4
  module LibHTS
5
+ # Get error description for bcf error code
6
+ attach_function \
7
+ :bcf_strerror,
8
+ %i[int pointer size_t],
9
+ :string
10
+
5
11
  # Create an empty BCF header.
6
12
  attach_function \
7
13
  :bcf_hdr_init,
@@ -272,7 +272,7 @@ module HTS
272
272
  alias bcf_itr_destroy hts_itr_destroy
273
273
 
274
274
  def bcf_itr_queryi(idx, tid, beg, _end)
275
- hts_itr_query(idx, tid, beg, _end, @@bcf_readrec)
275
+ hts_itr_query(idx, tid, beg, _end, @ffi_functions[:bcf_readrec])
276
276
  end
277
277
 
278
278
  @@bcf_hdr_name2id = proc do |hdr, id|
@@ -280,7 +280,7 @@ module HTS
280
280
  end
281
281
 
282
282
  def bcf_itr_querys(idx, hdr, s)
283
- hts_itr_querys(idx, s, @@bcf_hdr_name2id, hdr, @@hts_itr_query, @@bcf_readrec)
283
+ hts_itr_querys(idx, s, @@bcf_hdr_name2id, hdr, @ffi_functions[:hts_itr_query], @ffi_functions[:bcf_readrec])
284
284
  end
285
285
 
286
286
  # Load a BCF index
data/lib/hts/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HTS
4
- VERSION = "0.2.8"
4
+ VERSION = "0.2.9"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: htslib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.8
4
+ version: 0.2.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - kojix2
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-17 00:00:00.000000000 Z
11
+ date: 2024-09-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -52,76 +52,6 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: bundler
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: irb
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: minitest
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: rake
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: simplecov
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
55
  description:
126
56
  email:
127
57
  - 2xijok@gmail.com
@@ -189,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
189
119
  - !ruby/object:Gem::Version
190
120
  version: '0'
191
121
  requirements: []
192
- rubygems_version: 3.4.10
122
+ rubygems_version: 3.5.11
193
123
  signing_key:
194
124
  specification_version: 4
195
125
  summary: HTSlib bindings for Ruby